浏览 6111 次
锁定老帖子 主题:依旧简单的小工具XMLUtil
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-07-11
最后修改:2010-04-02
1.fix xml属性不能保存为基本数据类型的bug 2.实现了指定属性的注入 XML: <root> <WordType id="1" name="type1"/> <WordType id="2" name="type2"/> <Word name="w1" type.id="1" d="0.1"/> <Word name="w2" type.id="2" d="0.2"/> <Word name="w3" type.id="1" d="0.3"/> </root> Java: x.open(this.getClass().getClassLoader().getResource("subObject.xml").getFile()); List<List<Object>> result = x.getObjects(new Object[]{new WordType(),new Word()}); 以上代码得到的结构为: List result: List<WordType> r0 = result.get(0); 1 = r0.get(0).getId(); 2 = r0.get(1).getId(); List<Word> r1 = result.get(1); w1 = r1.get(0).getName(); 1 = r1.get(0).getWordType.getId(); w2 = r1.get(1).getName(); 2 = r1.get(1). getWordType.getId(); w3 = r1.get(2).getName(); 1 = r1.get(2). getWordType.getId(); 同理以上结构保存后得到这样的文档: <root> <WordType id="1" name="type1"/> <WordType id="2" name="type2"/> <Word d="0.1" name="w1" type.id="1"/> <Word d="0.2" name="w2" type.id="2"/> <Word d="0.3" name="w3" type.id="1"/> </root> ========================以上4.23.2009更新=========================== 增加新功能: 可以将某个属性保存为CDATA 使用该功能,需要定义一下CDATA的字段 XMLUtil util = new XMLUtil(); try{ util.setFieldNameOfCDATA("content"); util.create("Wiki","wiki.xml"); util.add(word); util.save(); }finally{ util.close(); } CDATA filed在一个element只能有一个,所以只定义一次. 为什么不用@CDATA,考虑良久,还是觉得annotation不能保持pojo的纯洁性. @CDATA让这个remark过的obj成为XMLUtil的专属对象,就像被hibernate remark过一样. 在遍地SOA应用的现在,pojo copy到其他地方,其他工程就必须要去掉这些anno. Jomper认为pojo应该是纯洁的,不应该被anno,interface污染.至少XMLUtil不愿意这样做. 如果需要pojo有更多的功能,应该用其他办法包装它. Jomper写过一个 ChangeSummary{ Str id,datetime,user,comment; Object pojo; } 这样就能避免入侵,也许Datagraph也可以这样的. ========================以上11.12.2008更新=========================== 增加了两个新接口: update(Object o,String primaryKeyName) List<Object> getObjectByKey(Object obj,String primaryKeyName) 下面是UT: @Before public void setUp() throws Exception { Word w = new Word(); w.setId("12321dsad"); w.setContent("scsdc"); Word w1 = new Word(); w1.setId("12321dsadas11"); w1.setContent("scsdc21s"); XMLUtil util = new XMLUtil(); try{ util.create("Wiki","test.xml"); util.add(w); util.add(w1); util.save(); }finally{ util.close(); } } @After public void tearDown() throws Exception { File f = new File("test.xml"); f.delete(); } @Test public void update() throws Exception{ Word w1 = new Word(); w1.setId("12321dsadas11"); w1.setContent("benben"); XMLUtil util = new XMLUtil(); try{ util.open("test.xml"); util.update(w1, "id"); util.save(); assertEquals(w1.getContent(),((Word)util.getObject(new Word(), "//Word[@id='"+w1.getId()+"']").get(0)).getContent()); }finally{ util.close(); } } @Test public void search() throws Exception { XMLUtil util = new XMLUtil(); try { util.open("test.xml"); assertEquals("scsdc21s",((Word)util.getObject(new Word(), "//Word[contains(@content,'c21')]").get(0)).getContent()); } finally{ util.close(); } } @Test public void searchByKey() throws Exception { XMLUtil util = new XMLUtil(); Word w = new Word(); w.setId("12321dsadas11"); try { util.open("test.xml"); assertEquals("scsdc21s",((Word)util.getObjectByKey(w, "id").get(0)).getContent()); } finally{ util.close(); } } =============================以上11.8.2008更新================================= 对以前写的一个XMLUtil做了一次重构 简单的小工具JomperXMLOperator 希望大家提出意见 写这个东西的目的就是 1.封装完全按照w3c规范的dom去处理xml. 2.xml 2 bean,bean 2 xml,数据绑定. 3.以后处理xml不用引入其他的包,一个类就行了。 4.方法更加的友好. 5.支持无数级深层次迭代,可以遍历对象的属性,和属性下的属性. 6.如果属性有范型将注入新对象,自动装载遍历到的数据。 看testcase应该就能全明白. jdk 5,6测试通过. 可能还会有bug,因为testcase写的还很片面,只是每个功能写了一个,但这是远远不够的。 public class TestXMLUtil { private Words words; private WordsType type,type1,type2; @Before public void setUp() throws Exception { type = new WordsType(); type.setName("person name"); type1 = new WordsType(); type1.setName("Greek letters"); type2 = new WordsType(); type2.setName("test"); List<WordsType> types = new ArrayList<WordsType> (); types.add(type); types.add(type1); types.add(type2); words = new Words(); words.setName("upslion"); words.setType(types); words.setContent("alalalala"); } @After public void tearDown() throws Exception { } @Test public void testAdd() throws Exception{ XMLUtil util = new XMLUtil(); util.create("XML"); util.add(words); util.save("xml/aa.xml"); util.close(); } @Test public void testDelete() throws Exception{ XMLUtil util = new XMLUtil(); util.open("xml/aa.xml"); util.delete("//WordsType[@name='Greek letters']"); util.save(); assertEquals(0,util.findNodes("//WordsType[@name='Greek letters']").size()); util.close(); } @Test public void testFindNodes() throws Exception{ XMLUtil util = new XMLUtil(); util.open("xml/aa.xml"); assertEquals(2,util.findNodes("//WordsType").size()); util.close(); } @Test public void testFindNodesValue() throws Exception{ XMLUtil util = new XMLUtil(); util.open("xml/aa.xml"); assertEquals("person name", util.findNodesValue("//WordsType[@name='person name']/@name").get(0)); util.close(); } @Test public void testUpdateString() throws Exception{ XMLUtil util = new XMLUtil(); util.open("xml/aa.xml"); util.update("//WordsType[@name='test']/@name", "tested"); util.save(); assertEquals("tested", util.findNodesValue("//WordsType[@name='tested']/@name").get(0)); util.close(); } @Test public void testGetObjects() throws Exception{ XMLUtil util = new XMLUtil(); util.open("xml/aa.xml"); List<Object> os = util.getObjects(new Words()); assertEquals("tested",((Words)os.get(0)).getType().get(1).getName()); util.close(); } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-07-30
不知道跟DOM4J及JDOM等开源框架比较起来有什么优势没有?
|
|
返回顶楼 | |
发表时间:2008-07-30
最明显就是不需要dom4j或者jdom的额外包.
简单难道不是最大的优势吗?自己认为比他们的用户体验要好。 其实我写这个的目的是在给数据访问服务(DAS),提供一个接口实现。避免在开发初期就过多的依赖数据库。btw 我坦白我在模仿db4o |
|
返回顶楼 | |
发表时间:2008-08-06
不错,简单就是王道。不过你也可以包装jdom之类的,把他包简单点使
|
|
返回顶楼 | |
发表时间:2008-08-08
这个轮子很不错。轻且好用
|
|
返回顶楼 | |
发表时间:2008-11-08
最后修改:2008-11-08
增加了两个新接口:
update(Object o,String primaryKeyName) List<Object> getObjectByKey(Object obj,String primaryKeyName) |
|
返回顶楼 | |
发表时间:2008-11-12
增加新功能: 可以将某个属性保存为CDATA
|
|
返回顶楼 | |
发表时间:2009-04-23
最后修改:2009-04-23
附件暂时穿不了... |
|
返回顶楼 | |
发表时间:2009-04-24
我记得Node的getNodeValue的方法行为在1.4和1.5是不一样的。具体是什么原因。我并没有仔细研究。我看你这工具里也使用了这个方法,不知在两1.4和1.5里都测试过了没有。
总之,还是支持一下。另外,我原来为了处理comment节点,搞得我不得不引进dom4j框架。不知道楼主有没有想法把comment的处理方法加上呢? |
|
返回顶楼 | |
发表时间:2009-04-27
grandboy 写道 我记得Node的getNodeValue的方法行为在1.4和1.5是不一样的。具体是什么原因。我并没有仔细研究。我看你这工具里也使用了这个方法,不知在两1.4和1.5里都测试过了没有。总之,还是支持一下。另外,我原来为了处理comment节点,搞得我不得不引进dom4j框架。不知道楼主有没有想法把comment的处理方法加上呢? 1.为了项目需要我也写过一个1.4版本的XMLUtil,很多的方法都不一样。后来就放弃1.4jdk了。1.4的XMLUtil我能找到,但是功能要落后很多。 2.comment应该没问题。因为有这个存在"org.w3c.dom.Comment"。 "org.w3c.dom"支持,我就支持。我尽快加上。 谢谢关注。 |
|
返回顶楼 | |