1-Dom4j:
DOM4J 是 dom4j.org 出品的一个开源 XML 解析包,Dom4j 是一个易用的、开源的库,用于 XML,
XPath 和 XSLT。它应用于 Java 平台,采用了 Java 集合框架并完全支持 DOM,SAX 和 JAXP。
dom4j 是一个 Java 的 XML API,类似于 jdom,用来读写 XML 文件的。dom4j 是一个非常非常优秀
的 JavaXML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软
件,可以在 SourceForge 上找到它。在 IBM developerWorks 上面可以找到一篇文章,对主流的 Java XML
API 进行的性能、功能和易用性的评测,dom4j 无论在哪个方面都是非常出色的。如今你可以看到越
来越多的 Java 软件都在使用 dom4j 来读写 XML,特别值得一提的是连 Sun 的 JAXM 也在用 dom4j。这
是必须使用的 jar 包, Hibernate 用它来读写配置文件。
2-解析 XML:
提供接口及解析机制:
dom4j 对底层原始的 XML 解析器进行了高度封装,正是这种封装简化了 XML 处理。在 dom4j 的
org.dom4j.io 包下提供了如下几个类:
- DOMReader:它负责根据 W3C 的 DOM 树创建 dom4j 树。
- SAXReader:它基于 SAX 解析机制来解析 XML 文档,并将其转换为 dom4j 树。
- XPP3Reader:其底层需要依赖于 XML Pull Parser 3.x 来解析 XML 文档,并将其转换为 dom4j
树。 - XPPReader:它是基于 XML Pull Parser 2.x 的解析器,目前不支持注释、DCATA 和处理指令。
3-读取 XML:
示例xml:
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person>
<name>李三</name>
<weixin>lisan_ww</weixin>
</person>
<person>
<name>张四</name>
</person>
<person>
<name>zhangsi_yy</name>
</person>
</persons>
根据 dom4j 底层提供的不同的 XML 解析器,可以有以下几种方式读取 XML 文档:
1) SAXReader 解析器方式:
public class Test {
@org.junit.Test
public void Test() throws Exception {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("04_jaxp/person.xml"));
}
}
2) XPP3Reader 解析器方式:
<span style="font-size:18px;">public class Test {
@org.junit.Test
public void Test() throws Exception {
XPP3Reader reader = new XPP3Reader();
Document document = reader.read(new File("04_jaxp/person.xml"));
}
}</span>
3)XPPReader 解析器方式:
public class Test1 {
@org.junit.Test
public void Test() throws Exception {
XPPReader reader = new XPPReader();
Document document = reader.read(new File("04_jaxp/person.xml"));
}
}
4-解析 XML
通过解析器读取 XML 文档完成后,使用 dom4j 解析 XML 文档:
1) 通过 Document 对象的 getRootElement()方法获取根元素;
2) 通过 Element 对象的 elements()方法获取根元素的所有子元素;
3) 遍历所有子元素,得到解析后的内容。
public class Test {
private static void iterDocument(Document document) {
//获取XML文档的根元素
Element rootElement = document.getRootElement();
//获取根元素下的所有子元素
List<Element> elements = rootElement.elements();
//遍历所有子元素集合
for (Element element : elements) {
//获取元素名称
String eleName = element.getName();
//获取name子元素的文本内容
String name = element.elementText("name");
//获取qq子元素的文本内容
String qq = element.elementText("qq");
//获取weixin子元素的文本内容
String weixin = element.elementText("weixin");
System.out.println(eleName + ": [name = " + name + ", qq = " +
qq + ", weixin = " + weixin + "]");
}
}
}
5- 修改 XML
通过 dom4j 修改 XML 文档需要如下几步:
1) 读取 XML 文档,得到 Document 对象及根元素;
2) 对解析得到的 XML 文档做修改、增加及删除操作;
3) 将修改后的内容,回写到当前 XML 文档中。
public class Test {
private void updateDocument(Document document) throws Exception {
//获取XML文档的根元素
Element rootElement = document.getRootElement();
//获取根元素下的所有子元素
List<Element> elements = rootElement.elements();
/***************修改元素****************/
//获取根元素下第一个person元素
Element firElement = elements.get(0);
//获取person元素下blog元素
Element blog = firElement.element("blog");
//修改blog元素的文本内容
blog.setText("http://blog.csdn.net/longestory");
/***************增加元素****************/
//为XML文档的根元素,增加新的子元素person
Element newElement = rootElement.addElement("person");
//为新增加的子元素,设置属性
newElement.addAttribute("number", "003");
//为新增加的子元素,添加一个name子元素,文本内容为longestory
newElement.addElement("name").setText("longestory");
/***************删除元素****************/
//获取根元素下第二个person元素
Element secElement = elements.get(1);
//获取第二个person元素下,需要删除的元素
Element delElement = secElement.element("blog");
//删除第二个person元素下的blog元素
secElement.remove(delElement);
/***************回写XML****************/
//创建格式化器,使用\t缩进,添加换行
OutputFormat format = new OutputFormat("\t", true);
//清空数据中原有的换行
format.setTrimText(true);
//创建XML输出流对象
XMLWriter writer = new XMLWriter(new
FileOutputStream("04_jaxp/person.xml"));
//输出Document
writer.write(document);
//关闭输出流
writer.close();
}
}
6-创建 XML
Document document = DocumentHelper.createDocument();
-
Node 下方法:
String asXML():把当前节点转换成字符串,如果当前 Node 是 Document,那么就会把整个 XML
文档返回;
String getName():获取当前节点名字;Document 的名字就是绑定的 XML 文档的路径;Element
的名字就是元素名称;Attribute 的名字就是属性名;
Document getDocument():返回当前节点所在的 Document 对象;
short getNodeType():获取当前节点的类型;
String getNodeTypeName():获取当前节点的类型名称,例如当前节点是 Document 的话,那
么该方法返回 Document;
String getStringValue():获取当前节点的子孙节点中所有文本内容连接成的字符串;
String getText():获取当前节点的文本内容。如果当前节点是 Text 等文本节点,那么本方法返
回文本内容;例如当前节点是 Element,那么当前节点的内容不是子元素,而是纯文本内容,
那么返回文本内容,否则返回空字符串;
void setDocument(Document doc):给当前节点设置文档元素;
void setParent(Element parent):给当前节点设置父元素;
void setText(String text):给当前节点设置文本内容 -
Branch 下方法
void add(Element e):添加子元素;
void add(Node node):添加子节点;
void add(Comment comment):添加注释;
Element addElement(String eleName):通过名字添加子元素,返回值为子元素对象;
void clearContent():清空所有子内容;
List content():获取所有子内容,与获取所有子元素的区别是,<name>liSi</name>元素没有子
元素,但有子内容;
Element elementById(String id):如果元素有名为“ID”的属性,那么可以使用这个方法来查找;
int indexOf(Node node):查找子节点在子节点列表中的下标位置;
Node node(int index):通过下标获取子节点;
int nodeCount():获取子节点的个数;
Iterator nodeIterator():获取子节点列表的迭代器对象;
boolean remove(Node node):移除指定子节点;
boolean remove(Commont commont):移除指定注释;
boolean remove(Element e):移除指定子元素;
void setContent(List content) :设置子节点内容;
-
Document 方法:
Element getRootElement():获取根元素;
void setRootElement():设置根元素;
String getXmlEncoding():获取 XML 文档的编码;
void setXmlEncoding():设置 XML 文档的编码;
-
Element 方法:
void add(Attribute attr):添加属性节点;
void add(CDATA cdata):添加 CDATA 段节点;
void add(Text Text):添加 Text 节点;
Element addAttribute(String name, String value):添加属性,返回值为当前元素本身;
Element addCDATA(String cdata):添加 CDATA 段节点 -
Element addComment(String comment):添加属性节点;
Element addText(String text):添加 Text 节点;
void appendAttributes(Element e):把参数元素 e 的所有属性添加到当前元素中;
Attribute attribute(int index):获取指定下标位置上的属性对象;
Attribute attribute(String name):通过指定属性名称获取属性对象;
int attributeCount():获取属性个数;
Iterator attributeIterator():获取当前元素属性集合的迭代器;
List attributes():获取当前元素的属性集合;
String attributeValue(String name):获取当前元素指定名称的属性值;
Element createCopy():clone 当前元素对象,但不会 copy 父元素。也就是说新元素没有父元
素,但有子元素;
Element element(String name):获取当前元素第一个名称为 name 的子元素;
Iterator elementIterator():获取当前元素的子元素集合的迭代器;
Iterator elementIterator(String name):获取当前元素中指定名称的子元素集合的迭代器;
List elements():获取当前元素子元素集合;
List elements(String name):获取当前元素指定名称的子元素集合;
String elementText(String name):获取当前元素指定名称的第一个元素文件内容;
String elementTextTrime(String name):同上,只是去除了无用空白;
boolean isTextOnly():当前元素是否为纯文本内容元素; -
boolean remove(Attribute attr):移除属性;
boolean remove(CDATA cdata):移除 CDATA;
boolean remove(Text text):移除 Text。 -
DocumentHelper 静态方法:
static Document createDocument():创建 Dcoument 对象;
static Element createElement(String name):创建指定名称的元素对象;
static Attribute createAttrbute(Element owner, String name, String value):创建属性对象;
static Text createText(String text):创建属性对象;
static Document parseText(String text):通过给定的字符串生成 Document 对象;