`
jomper
  • 浏览: 38028 次
  • 性别: Icon_minigender_1
  • 来自: 湖北-武汉
社区版块
存档分类
最新评论

依旧简单的小工具XMLUtil

    博客分类:
  • Java
阅读更多
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();
	}

}

分享到:
评论
9 楼 jomper 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"支持,我就支持。我尽快加上。

谢谢关注。
8 楼 grandboy 2009-04-24  
我记得Node的getNodeValue的方法行为在1.4和1.5是不一样的。具体是什么原因。我并没有仔细研究。我看你这工具里也使用了这个方法,不知在两1.4和1.5里都测试过了没有。

总之,还是支持一下。另外,我原来为了处理comment节点,搞得我不得不引进dom4j框架。不知道楼主有没有想法把comment的处理方法加上呢?
7 楼 jomper 2009-04-23  


附件暂时穿不了...

6 楼 jomper 2008-11-12  
增加新功能: 可以将某个属性保存为CDATA
5 楼 jomper 2008-11-08  
增加了两个新接口:
update(Object o,String primaryKeyName)
List<Object> getObjectByKey(Object obj,String primaryKeyName)
4 楼 murainwood 2008-08-08  
这个轮子很不错。轻且好用
3 楼 black_zerg 2008-08-06  
不错,简单就是王道。不过你也可以包装jdom之类的,把他包简单点使
2 楼 jomper 2008-07-30  
最明显就是不需要dom4j或者jdom的额外包.
简单难道不是最大的优势吗?自己认为比他们的用户体验要好。

其实我写这个的目的是在给数据访问服务(DAS),提供一个接口实现。避免在开发初期就过多的依赖数据库。btw 我坦白我在模仿db4o
1 楼 ispring 2008-07-30  
不知道跟DOM4J及JDOM等开源框架比较起来有什么优势没有?

相关推荐

    xmlutil XMl工具类

    xml2bean

    Java操作XML工具类XmlUtil详解

    Java操作XML工具类XmlUtil详解 Java操作XML工具类XmlUtil是Java中一个非常重要的工具类,它提供了许多实用的方法来操作XML文件。在本文中,我们将详细介绍XmlUtil的使用方法和实现原理,希望能够为大家提供有价值的...

    desktop and xmlutil

    - 在编程中,XMLUtil通常指的是一个工具类或库,用于处理XML文档,如解析、验证、创建、修改等操作。 - 这个工具可能包含了XML的读取、写入、查找特定节点、转换成JSON等功能。 - 在Java中,例如,我们可以使用...

    XMLUtil.class

    Flex网上书店 运行时 的 XMLUtil.class

    XMLUtil java XML orm toolkit

    XMLUtil 是一个基于Java的XML对象关系映射(ORM)工具包,它的主要目标是简化XML数据与Java对象之间的交互。ORM技术的核心理念是通过映射机制将数据库中的数据自动转化为对象,反之亦然,而XMLUtil则是在XML文档与...

    XMLUtil.java

    XMLUtil.java,,这就是一小串代码,是一个配置文件,放在Java程序里面。

    C#常用基础工具类源码

    整理了几个在DotNet2.0中C#开发常用的基础工具类,内容如下:StringUtil、ParseUtil、TypeUtil、ByteUtil、NumUtil、XmlUtil、RegexUtil、HashUtil、ColorUtil。

    JS操作XML工具类XmlUtils

    XmlUtils JS操作XML工具类 **  * 加载xml文件,参数:  * @param {string} xmlPath:加载的xml文件路径; * @return {Object} true 正常加载; false 加载失败 *

    java Dom4j 无敌连环解析XML工具类

    这个XMLUtil工具类包含了解析XML文件、获取根元素、读取属性值、遍历子元素以及使用XPath查找元素等常用操作。你可以根据实际需求扩展此工具类,添加更多的功能,例如创建新的XML文档、修改现有元素等。 使用这个...

    hutool一个Java基础工具类

    XmlUtil工具类简化了XML的读写操作,可以方便地解析XML文档,获取节点信息。例如,获取XML文件的根节点: ```java Element root = XmlUtil.getRootElement(new File("xml文件路径")); ``` 综上所述,Hutool作为...

    Android开发中解析xml文件XmlUtils工具类与用法示例

    1. xmlUtil工具类 package com.example.xmlpaserutil.util; import java.io.InputStream; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import org.xmlpull.v1....

    制作工具类及说明文档

    9. **模块化设计**:工具类可以按照功能划分为多个小的工具类,如`IOUtil`、`XMLUtil`等,以保持代码的整洁和清晰。 10. **测试**:与所有软件组件一样,工具类也需要进行充分的单元测试,确保其功能的正确性和健壮...

    XMLUtil.txt

    微信JSAPI工具包

    XmlUtil.java

    工作中经常使用的Java工具类分享,做Java开发用得上。

    XmlUtil.zip_Java编程_Java_

    本教程将深入探讨Java如何处理XML文件,以"XmlUtil.zip"中的"XmlUtil.java"为例,讲解相关的Java XML处理技术。 首先,Java提供了DOM(Document Object Model)、SAX(Simple API for XML)和StAX(Streaming API ...

Global site tag (gtag.js) - Google Analytics