XML解析之二—— Dom4j、JAXP、JDom(含XPath)

XML解析开发包
Dom4J:是开源组织推出的解析开发包。(牛,大家都在用,包括SUN公司的一些技术的实现都在用)
JAXP(Java API for XML Processing):是SUN公司推出的解析标准实现。
JDom:是开源组织推出的解析开发包。

Dom4j是由早期开发JDOM的人分离出来而后独立开发的。与JDOM不同的是,dom4j使用接口和抽象基类,虽然Dom4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性。
Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j。

Dom4J

使用dom4j解析xml前,先要导入jar包dom4j.jar包和jaxen.jar包
dom4j官网: 点击打开链接

DOM4j中,获得Document对象的方式有三种:
1.读取XML文件,获得document对象
SAXReader reader = new SAXReader();
Document document = reader.read(new File("input.xml"));

2.解析XML形式的文本,得到document对象.
String text = "<members></members>";
Document document = DocumentHelper.parseText(text);

3.主动创建document对象.
Document document = DocumentHelper.createDocument();
//创建根节点
Element root = document.addElement("members");

节点对象
1.获取文档的根节点.
Element root = document.getRootElement();
2.取得某个节点的子节点.
Element element=node.element(“书名");
3.取得节点的文字
String text=node.getText();
4.取得某节点下所有名为“member”的子节点,并进行遍历.

List nodes = rootElm.elements("member");
for (Iterator it = nodes.iterator(); it.hasNext();) {
Element elm = (Element) it.next();
// do something
}
5.对某节点下的所有子节点进行遍历.
for(Iterator it=root.elementIterator();it.hasNext();){
Element element = (Element) it.next();
// do something
}
6.在某节点下添加子节点.
Element ageElm = newMemberElm.addElement("age");
7.设置节点文字.
element.setText("29");
8.删除某节点.
//childElm是待删除的节点,parentElm是其父节点
parentElm.remove(childElm);
9.添加一个CDATA节点.
Element contentElm = infoElm.addElement("content");
contentElm.addCDATA(diary.getContent());

节点对象属性
1.取得某节点下的某属性
Element root=document.getRootElement();
//属性名name
Attribute attribute=root.attribute("size");
2.取得属性的文字
String text=attribute.getText();
3.删除某属性
Attribute attribute=root.attribute("size");
root.remove(attribute);
3.遍历某节点的所有属性
Element root=document.getRootElement();
for(Iterator it=root.attributeIterator();it.hasNext();){
Attribute attribute = (Attribute) it.next();
String text=attribute.getText();
System.out.println(text);

}
4.设置某节点的属性和文字.
newMemberElm.addAttribute("name","sitinspring");
5.设置属性的文字
Attribute attribute=root.attribute("name");
attribute.setText("sitinspring");

将文档写入XML文件.
1.文档中全为英文,不设置编码,直接写入的形式.
XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));
writer.write(document);
writer.close();
2.文档中含有中文,设置编码格式写入的形式.
OutputFormat format = OutputFormat.createPrettyPrint();
// 指定XML编码
format.setEncoding("GBK");
XMLWriter writer = new XMLWriter(newFileWriter("output.xml"),format);
writer.write(document);
writer.close();

Dom4j在指定位置插入节点
1.得到插入位置的节点列表(list)
2.调用list.add(index,elemnent),由index决定element的插入位置。
Element元素可以通过DocumentHelper对象得到。示例代码:
Element aaa = DocumentHelper.createElement("aaa");
aaa.setText("aaa");

List list = root.element("书").elements();
list.add(1,aaa);
//更新document


例子:

<?xml version="1.0" encoding="UTF-8"?>
<books> 
  <book 出版日期="2013-08-27" 出版社="人民出版社" 编号="b1" 页数="120" > 
    <name>葵花宝典</name>  
    <author>东方不败</author>  
    <author>春哥</author>
    <price>18元</price>  
    <author>林平之</author>  
    <desc>欲练此功,必先自宫111111!!</desc>  
    <author>曾哥</author> 
  </book>  
  <book 出版社="邮电出版社" 类别="武侠" 编号="b2"> 
    <name>辟邪剑谱</name>  
    <author>岳不群</author>  
    <price>20元</price>  
    <desc>欲练此功,必先自宫2222222!!</desc> 
  </book> 
</books>

解析以上xml文件的代码
public class DOM4J {

	public static void main(String[] args) throws Exception {
		test7();
	}
	/**
	 * XPATH的写法  
	 * @throws Exception
	 */
	private static void test7() throws Exception {
		SAXReader reader = new SAXReader();
		Document document = reader.read("src/persons.xml");
		
		/*List<Node> list = document.selectNodes("/books/book");
		Node node = document.selectSingleNode("//book[2]");*/
		
		Node node = document.selectSingleNode("//person[@username='aa' and @password='aa']");
		
		Element e = (Element) node;
		System.out.println(e.element("name").getText());
	}
	/**
	 * 遍历所有的节点
	 * @throws Exception 
	 */
	private static void test6() throws Exception {
		SAXReader reader = new SAXReader();
		Document document = reader.read("src/book.xml");
		Element root = document.getRootElement();	
		list(root);
	}

	private static void list(Element root) {
		System.out.println(root.getName());
		List<Element> list = root.elements();
		for(int i=0;i<list.size();i++){
			Element e = list.get(i);
			list(e);
		}
	}

	/**
	 * 在指定的位置添加
	 * @throws Exception 
	 */
	private static void test5() throws Exception {
		SAXReader reader = new SAXReader();
		Document document = reader.read("src/book.xml");
		Element root = document.getRootElement();	
		
		//创建一个元素
		Element author = DocumentHelper.createElement("author");
		author.setText("春哥");
		//在第一本书的第一个作者之前  添加一个作者  春哥
		List<Element> list = root.element("book").elements();
		list.add(2,author);
		
		//回写XML
		OutputFormat format = OutputFormat.createPrettyPrint();
		format.setEncoding("UTF-8");
		XMLWriter writer = new XMLWriter(new FileWriter("src/book.xml"),format);
		writer.write(document);
		writer.close();
	}

	/**
	 * 删除某个节点:删除第一本书的第四个作者
	 * @throws Exception 
	 */
	public static void test4() throws Exception{
		SAXReader reader = new SAXReader();
		Document document = reader.read("src/book.xml");
		Element root = document.getRootElement();
		
		Element author = (Element) root.element("book").elements("author").get(3);
		//删除的话  
		author.getParent().remove(author);
		
		//回写XML
		OutputFormat format = OutputFormat.createPrettyPrint();
		format.setEncoding("UTF-8");
		XMLWriter writer = new XMLWriter(new FileWriter("src/book.xml"),format);
		writer.write(document);
		writer.close();
	}
	/**
	 * 修改某个节点:修改第一本书中的售价  18元
	 * @throws Exception 
	 */
	private static void test3() throws Exception {
		SAXReader reader = new SAXReader();
		Document document = reader.read("src/book.xml");
		Element root = document.getRootElement();
		
		root.element("book").element("price").setText("18元");
		
		//回写XML
		OutputFormat format = OutputFormat.createPrettyPrint();
		format.setEncoding("UTF-8");
		XMLWriter writer = new XMLWriter(new FileWriter("src/book.xml"),format);
		writer.write(document);
		writer.close();
		
	}
	/**
	 * 使用dom4j添加一个节点:在第一本书上添加一个作者
	 * @throws Exception 
	 */
	private static void test2() throws Exception {
		SAXReader reader = new SAXReader();
		Document document = reader.read("src/book.xml");
		Element root = document.getRootElement();
		
		//找到第一本书
		root.element("book").addElement("author").setText("春哥");
		
		//回写XML
		OutputFormat format = OutputFormat.createPrettyPrint();
		format.setEncoding("UTF-8");
		XMLWriter writer = new XMLWriter(new FileWriter("src/book.xml"),format);
		writer.write(document);
		writer.close();
		
	}

	/**
	 * 使用dom4j查找某个节点
	 * @throws Exception 
	 */

	private static void test1() throws Exception {
		//创建一个解析器
		SAXReader reader = new SAXReader();
		
		//解析XML文档
		Document document = reader.read("src/book.xml");
		
		//获得跟节点
		Element root = document.getRootElement();
	/*	//获得所有的书节点
		List<Element> list = root.elements("book");
		Element book1 = list.get(0);//获得第一本书
	 */		
		//获得第一本书
		Element book = root.element("book");
		List<Element> list = book.elements("author");
		Element author = list.get(0);
		String value = author.getText();//获得作者中的内容
		System.out.println(value);
		
		Element author1 = (Element) root.element("book").elements("author").get(0);
		System.out.println(author1.getText());
		
	}
}
说明:test7使用的XPath方式

相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念