论坛首页 Java企业应用论坛

依旧简单的小工具XMLUtil

浏览 6111 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-07-11   最后修改:2010-04-02
4.2.2010:支持缩进,支持cdata

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();
	}

}

   发表时间:2008-07-30  
不知道跟DOM4J及JDOM等开源框架比较起来有什么优势没有?
0 请登录后投票
   发表时间:2008-07-30  
最明显就是不需要dom4j或者jdom的额外包.
简单难道不是最大的优势吗?自己认为比他们的用户体验要好。

其实我写这个的目的是在给数据访问服务(DAS),提供一个接口实现。避免在开发初期就过多的依赖数据库。btw 我坦白我在模仿db4o
0 请登录后投票
   发表时间:2008-08-06  
不错,简单就是王道。不过你也可以包装jdom之类的,把他包简单点使
0 请登录后投票
   发表时间:2008-08-08  
这个轮子很不错。轻且好用
0 请登录后投票
   发表时间:2008-11-08   最后修改:2008-11-08
增加了两个新接口:
update(Object o,String primaryKeyName)
List<Object> getObjectByKey(Object obj,String primaryKeyName)
0 请登录后投票
   发表时间:2008-11-12  
增加新功能: 可以将某个属性保存为CDATA
0 请登录后投票
   发表时间:2009-04-23   最后修改:2009-04-23


附件暂时穿不了...

0 请登录后投票
   发表时间:2009-04-24  
我记得Node的getNodeValue的方法行为在1.4和1.5是不一样的。具体是什么原因。我并没有仔细研究。我看你这工具里也使用了这个方法,不知在两1.4和1.5里都测试过了没有。

总之,还是支持一下。另外,我原来为了处理comment节点,搞得我不得不引进dom4j框架。不知道楼主有没有想法把comment的处理方法加上呢?
0 请登录后投票
   发表时间: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"支持,我就支持。我尽快加上。

谢谢关注。
1 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics