dom4j介绍
官网:http://www.dom4j.org/
dom4j包下载地址:https://sourceforge.net/projects/dom4j/?source=directory (这里给的是1.6.1版本)
目前解析xml的方法有Dom和Sax这两种标准解析方式,还有第三方开发的JDom和dom4j工具。
由于Dom、Sax、JDom比较原始,操作复杂,封装不完善,现在主流使用dom4j操作xml。
而dom4j官方示例简单晦涩,例子还比较少,这里详细介绍其使用方法。
使用示例
读xml文档(解析)
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book id="001">
<title>Harry Potter</title>
<author>J K. Rowling</author>
</book>
<book id="002">
<title>Learning XML</title>
<author>Erik T. Ray</author>
</book>
</books>
List列表解析xml 示例
package com.xm.xml;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.util.List;
public class ListDemo {
public static void main(String[] args) throws Exception {
SAXReader reader = new SAXReader();
File file = new File("properties/books.xml");
Document document = reader.read(file);
Element root = document.getRootElement();
List<Element> childElements = root.elements();
for (Element child : childElements) {
//未知属性名情况下
List<Attribute> attributeList = child.attributes();
for (Attribute attr : attributeList) {
System.out.println(attr.getName() + ": " + attr.getValue());
}
//已知属性名情况下
/*System.out.println("id: " + child.attributeValue("id"));*/
//未知子元素名情况下
List<Element> elementList = child.elements();
for (Element ele : elementList) {
System.out.println(ele.getName() + ": " + ele.getText());
}
System.out.println();
//已知子元素名的情况下
/*System.out.println("title" + child.elementText("title"));
System.out.println("author" + child.elementText("author"));*/
//格式化美观而存在
System.out.println();
}
}
}
使用Iterator迭代解析xml示例
package com.xm.xml;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.util.Iterator;
public class IterDemo {
public static void main(String[] args) throws Exception {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("properties/books.xml"));
Element root = document.getRootElement();
Iterator it = root.elementIterator();
while (it.hasNext()) {
Element element = (Element) it.next();
//未知属性名称情况下
/*Iterator attrIt = element.attributeIterator();
while (attrIt.hasNext()) {
Attribute a = (Attribute) attrIt.next();
System.out.println(a.getValue());
}*/
//已知属性名称情况下
System.out.println("id: " + element.attributeValue("id"));
//未知元素名情况下
/*Iterator eleIt = element.elementIterator();
while (eleIt.hasNext()) {
Element e = (Element) eleIt.next();
System.out.println(e.getName() + ": " + e.getText());
}
System.out.println();*/
//已知元素名情况下
System.out.println("title: " + element.elementText("title"));
System.out.println("author: " + element.elementText("author"));
System.out.println();
}
}
}
解析结果
创建xml文档
package com.xm.xml;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import java.io.File;
import java.io.FileOutputStream;
/**
* Created by xuming on 2016/7/20.
*/
public class createXmlDemo {
public static void main(String[] args) throws Exception {
Document doc = DocumentHelper.createDocument();
//增加根节点
Element books = doc.addElement("books");
//增加子元素
Element book1 = books.addElement("book");
Element title1 = book1.addElement("title");
Element author1 = book1.addElement("author");
Element book2 = books.addElement("book");
Element title2 = book2.addElement("title");
Element author2 = book2.addElement("author");
//为子节点添加属性
book1.addAttribute("id", "001");
//为元素添加内容
title1.setText("Harry Potter");
author1.setText("J K. Rowling");
book2.addAttribute("id", "002");
title2.setText("Learning XML");
author2.setText("Erik T. Ray");
//实例化输出格式对象
OutputFormat format = OutputFormat.createPrettyPrint();
//设置输出编码
format.setEncoding("UTF-8");
//创建需要写入的File对象
File file = new File("C:" + File.separator + "books.xml");
//生成XMLWriter对象,构造函数中的参数为需要输出的文件流和格式
XMLWriter writer = new XMLWriter(new FileOutputStream(file), format);
//开始写入,write方法中包含上面创建的Document对象
writer.write(doc);
}
}
创建xml的结果
项目应用示例
xml文件
<?xml version="1.0" encoding="UTF-8"?>
<modules id="123">
<module>这个是module标签的文本信息</module>
<module id="">
<name>oa</name>
<value>系统基本配置</value>
<descript>对系统的基本配置根目录</descript>
<module>这个是子module标签的文本信息</module>
</module>
<module>
<name>管理配置</name>
<value>none</value>
<descript>管理配置的说明</descript>
<module id="106">
<name>系统管理</name>
<value>0</value>
<descript>Config</descript>
<module id="107">
<name>部门编号</name>
<value>20394</value>
<descript>编号</descript>
</module>
</module>
</module>
</modules>
解析代码
package com.xm.xml;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.util.List;
/**
* Created by xuming on 2016/7/20.
*/
public class ParseDemo {
public static void main(String[] args) throws Exception {
ParseDemo parseDemo = new ParseDemo();
parseDemo.parse();
}
public void parse() {
try {
//创建SAXReader读取器,专门用于读取xml
SAXReader saxReader = new SAXReader();
File file = new File("properties/demo.xml");
Document document = saxReader.read(file);
Element rootElement = document.getRootElement();
if (rootElement.elements("module") != null) {
//因为第一个module标签只有内容没有子节点,直接.iterator()就java.lang.NullPointerException了, 所以需要分开实现
List<Element> elementList = rootElement.elements("module");
for (Element element : elementList) {
if (!element.getTextTrim().equals("")) {
System.out.println("【1】" + element.getTextTrim());
} else {
Element nameElement = element.element("name");
System.out.println(" 【2】" + nameElement.getName() + ":" + nameElement.getText());
Element valueElement = element.element("value");
System.out.println(" 【2】" + valueElement.getName() + ":" + valueElement.getText());
Element descriptElement = element.element("descript");
System.out.println(" 【2】" + descriptElement.getName() + ":" + descriptElement.getText());
List<Element> subElementList = element.elements("module");
for (Element subElement : subElementList) {
if (!subElement.getTextTrim().equals("")) {
System.out.println(" 【3】" + subElement.getTextTrim());
} else {
Element subnameElement = subElement.element("name");
System.out.println(" 【3】" + subnameElement.getName() + ":" + subnameElement.getText());
Element subvalueElement = subElement.element("value");
System.out.println(" 【3】" + subvalueElement.getName() + ":" + subvalueElement.getText());
Element subdescriptElement = subElement.element("descript");
System.out.println(" 【3】" + subdescriptElement.getName() + ":" + subdescriptElement.getText());
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
以上具体代码及示例应用见我的github。
结果
参考文献
Dom4j解析和生成XML文档:http://blog.csdn.net/chenghui0317/article/details/11486271
在java中使用dom4j解析xml:http://www.cnblogs.com/nerxious/archive/2013/05/04/3060263.html