Java解析XML之dom4j方式

      DOM4J是dom4j.org出品的一个开源XML解析包。Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT。它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。
      需要的jar包:dom4j-1.6.1.jar、jaxen-1.1-beta-6.jar。

示例:
default.xml
<?xml version="1.0" encoding="UTF-8"?>

<groups>
	<stu id="001">
		<name>zero001</name>
		<email>[email protected]</email>
	</stu>
	<stu id="002">
		<name>zero002</name>
		<email>[email protected]</email>
	</stu>
</groups>
Dom4jRead.java
import java.io.File;
import java.util.Iterator;
import java.util.List;

import org.dom4j.*;
import org.dom4j.io.SAXReader;

public class Dom4jRead {
	public static void main(String[] args) throws DocumentException {
		SAXReader reader = new SAXReader();
		Document document = reader.read(new File("default.xml"));
		Element rootElement = document.getRootElement();// 根节点

		System.out.println("根节点: " + rootElement.getName());

		// 枚举所有子节点
		for (Iterator it = rootElement.elementIterator(); it.hasNext();) {
			Element element = (Element) it.next();
			System.out.println(element.getName());
		}

		// 枚举名称为xxx的节点的子节点
		for (Iterator it = rootElement.element("stu").elementIterator(); it
				.hasNext();) {
			Element element = (Element) it.next();
			System.out.print(element.getName() + ": ");
			System.out.println(element.getText());
			System.out.println(element.getStringValue());
		}

		// 枚举属性
		for (Iterator it = rootElement.element("stu").attributeIterator(); it
				.hasNext();) {
			Attribute attribute = (Attribute) it.next();
			System.out
					.println(attribute.getName() + "=" + attribute.getValue());
		}

		// rootElement.element("stu"), 取第一个stu
		// List list = rootElement.elements("stu"); 取所有stu
	}

}
Dom4jWrite.java
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;

import org.dom4j.*;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

public class Dom4jWrite {
	public static void main(String[] args) {
		Document document = DocumentHelper.createDocument();
		Element root = document.addElement("groups");

		Element stuElement = root.addElement("stu");
		Element nameElement = stuElement.addElement("name");
		Element ageElement = stuElement.addElement("age");
		nameElement.addAttribute("id", "1").setText("萧");
		ageElement.setText("18");

		Element stu = DocumentHelper.createElement("stu");
		stu.add(DocumentHelper.createElement("name"));
		stu.add(DocumentHelper.createElement("age"));
		document.getRootElement().add(stu);

		// 删除
		// stu.getParent().remove(stu);

		try {
			// FileWriter out = new FileWriter("my.xml");
			// document.write(out);
			// out.flush();
			// out.close();

			// 格式美化
			OutputFormat format = OutputFormat.createPrettyPrint();
			format.setEncoding("UTF-8");

			// XMLWriter writer = new XMLWriter(new FileWriter("out.xml"),
			// format);
			XMLWriter writer = new XMLWriter(new FileOutputStream("out.xml"),
					format);

			writer.write(document);
			writer.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}
运行结果:out.xml
<?xml version="1.0" encoding="UTF-8"?>
<groups>
  <stu>
    <name id="1">萧</name>
    <age>18</age>
  </stu>
  <stu>
    <name/>
    <age/>
  </stu>
</groups>

      采用dom4j的方式读取xml文件,不能越层访问,而与xpath配合使用就可以很方便的越层访问。
简单示例:
xpath.xml
<?xml version="1.0" encoding="UTF-8"?>
<AAA>
	<BBB id="b1">
		<CCC>
			<DDD>d</DDD>
		</CCC>
	</BBB>
	<BBB id="b2" />
	<BBB>
		<DDD>d</DDD>
	</BBB>
	<BBB name="bbb" />
</AAA>
Dom4jXpath.xml
import java.io.File;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class Dom4jXpath {
	// dom4j 配合 xpath
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		SAXReader reader = new SAXReader();
		Document document = reader.read(new File("xpath.xml"));

		List eList = document.selectNodes("/AAA");
		System.out.println(eList.size());// 1

		eList = document.selectNodes("/AAA/BBB");
		System.out.println(eList.size());// 4

		eList = document.selectNodes("/AAA/CCC");
		System.out.println(eList.size());// 0

		eList = document.selectNodes("//DDD");// 不管层级关系,直接取得DDD节点
		System.out.println(eList.size());// 2

		// document.selectNodes("/AAA/BBB/*"); AAA/BBB/下的所有节点
		// document.selectNodes("/*/*/CCC"); 有两个父节点的CCC节点
		// /AAA/BBB[1],/AAA/BBB[last()]
	}
}



你可能感兴趣的:(Java解析XML之dom4j方式)