您的位置:首页 > 其它

使用dom4j解析XML

2015-05-06 11:37 399 查看

使用dom4j解析XML

概述

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

dom4j是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。

对主流的Java XML API进行的性能、功能和易用性的评测,dom4j无论在那个方面都是非常出色的。如今你可以看到越来越多的Java软件都在使用dom4j来读写XML,例如Hibernate,包括sun公司自己的JAXM也用了dom4j。

使用dom4j开发,首先下载dom4j相应的jar文件:

官网下载: http://www.dom4j.org/dom4j-1.6.1/

dom4j是sourceforge.net上的一个开源项目,因此可以到http://sourceforge.net/projects/dom4j下载其最新版。

dom4j主要的接口



dom4j的API接口说明
Node它是dom4j树中所有节点的根接口
Branch它代表能包含子节点的节点,Branch接口下有两个子接口:Element和Document
Element它代表XML元素
Document它代表XML文档根
Attribute它代表XML元素的属性
DocumentType它代表XML文档里的DOCTYPE声明
ProcessingInstruction它代表XML文档里的处理指令
CharacterData它是所有文本元素的父接口,有CDATA、Text和Comment3个子接口
Entity定义 XML entity
CDATA它代表XML文档里的CDATA
Text它代表XML文档里的文本内容
Comment它代表XML文档里的注释内容
dom4j中较为重要的解析器以及一些工具类

DOMWriter

SAXWriter

XMLWriter

Writer作用是将dom4j树转换成不同前缀的树或文件。

DocumentFactory:提供一个创建一个Document对象的方法:createDocument();

DocumentHelper:该工具提供了大量静态方法用于创建XML文档各组成部分。

使用dom4j操作xml

在使用dom4j解析xml之前,先将 dom4j-1.6.1.jar 添加到项目中。

要使用dom4j解析XML文件,首先需要获取文档的根,即Document。

在dom4j中,获取Document对象的方法有:

创建Document对象

Document document = DocumentHelper.createDocument();

Element root = document.addElement(“students”); // 根元素节点

读取XML文件时,获取Document对象

SAXReader reader = new SAXReader();

Document document = reader.read(new File(“student.xml”));

字符串解析为XML时,获取Document对象

String text = “tom“;

Document document = DocumentHelper.parseText(text);

创建XML文档

/**
* 创建XML文件
*
* @throws IOException
*/
public void createXml() throws IOException {
// 创建Document对象
Document document = DocumentHelper.createDocument();
// 根元素节点
Element root = document.addElement("students");
root.addComment("all students info"); // 添加注释
Element student = root.addElement("student"); // 根元素节点添加子节点
student.addAttribute("id", "001"); // 添加节点属性
Element name = student.addElement("name");
name.addText("tommy"); // 设置节点文本
Element age = student.addElement("age");
age.addText("18");
// 设置XML美化格式
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("utf-8"); // 编码字符集设置
// xml写入器
XMLWriter writer = new XMLWriter(new FileWriter("students.xml"), format);
// 写操作
writer.write(document);
writer.flush();
writer.close();
}


结果:



修改XML文档

/**
* 修改xml文件
*
* @throws Exception
*/
public void modifyXml() throws Exception {
// 创建SAXReader对象
SAXReader reader = new SAXReader();
Document document = reader.read(new File("students.xml"));
/** 修改内容之一: 如果student节点中id属性的内容为001,则修改成1001。因为查找节点使用到了Xpath,所以还需要将 jaxen-1.1-beta-6.jar 包添加到项目中 */
List list = document.selectNodes("/students/student/@id");
Iterator it = list.iterator();
while (it.hasNext()) {
Attribute attr = (Attribute) it.next();
if ("001".equals(attr.getValue()))
attr.setValue("1001");
}
/**
* 修改内容之二: name项内容若为"tommy",则改为"tom"
*/
list = document.selectNodes("/students/student/name");
it = list.iterator();
while (it.hasNext()) {
Element name = (Element) it.next();
if ("tommy".equals(name.getText())) {
name.setText("tom");
}
}
/** 修改内容之三: 将id="1001"的学生age节点删除,再添加birth节点 */
list = document.selectNodes("/students/student/@id");
it = list.iterator();
while (it.hasNext()) {
Attribute attr = (Attribute) it.next();
if ("1001".equals(attr.getValue())) {
Element parent = attr.getParent();
Iterator iterator = parent.elementIterator("age");
if (iterator.hasNext()) {
Element elem = (Element) iterator.next();
parent.remove(elem);
}
Element birth = parent.addElement("birth");
birth.setText("1995-01-01");
break;
}
}
/* 将document中的内容写入文件中 */
// 设置XML美化格式
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("utf-8"); // 编码字符集设置
// xml写入器
XMLWriter writer = new XMLWriter(new FileWriter("students.xml"), format);
writer.write(document);
writer.close();
}


结果:



遍历XML文档

/**
* 遍历节点
*
* @throws Exception
*/
public void readXml() throws Exception {
// 创建SAXReader对象
SAXReader reader = new SAXReader();
// 加载xml文件
Document document = reader.read(new File("students.xml"));
// 获取根元素节点
Element root = document.getRootElement();
// 递归遍历所有节点内容
read(root);
}

/**
* 读节点信息
*
* @param element
*            student节点
*/
private void read(Element element) {
for (int i = 0, size = element.nodeCount(); i < size; i++) {
Node node = element.node(i); // 获取元素的子节点
if (node instanceof Comment) // 注释节点
continue;
if (node instanceof Element) { // 元素节点
Element elem = (Element) node;
System.out.print(elem.getName() + " : ");
if ("student".equals(node.getName())) { // 是student节点
System.out.println();
Iterator attr = elem.attributes().iterator(); // student节点属性
while (attr.hasNext()) {
Attribute at = (Attribute) attr.next();
System.out
.println(at.getName() + " : " + at.getValue());
}
}
read((Element) node);
} else if (node instanceof Text) { // 文本节点
if (!"".equals(node.getText().trim()))
System.out.println(node.getText());
}
}
}


结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: