DOM4J是dom4j.org出品的一个开源XML解析包。Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT。它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。
那我们现在就来看怎么使用dom4j
1.创建xml文档
要创建如下形式的xml
从中,我们可以看出一个xml文件包含元素(element)和属性(attribute),这对于下面的解析至关重要。
创建完成以后,我们可以将doucment存放到一个String中,或者一个文件中
(1)存放到String
2.解析xml文档
root element: data
root attribute:userInfo
根节点下元素的个数:2
孩子结点下的元素个数:1
结点consNo对应的属性值:01001
它的主要接口都在org.dom4j这个包里定义:
Attribute定义了XML的属性
| |
Branch为能够包含子节点的节点如XML元素(Element)和文档(Docuemnts)定义了一个公共的行为,
| |
CDATA 定义了XML CDATA 区域
| |
CharacterData是一个标识借口,标识基于字符的节点。如CDATA,Comment, Text.
| |
Comment 定义了XML注释的行为
| |
定义了XML文档
| |
DocumentType 定义XML DOCTYPE声明
| |
Element定义XML 元素
| |
ElementHandler定义了 Element 对象的处理器
| |
被
ElementHandler 使用,用于取得当前正在处理的路径层次信息
| |
Entity定义 XML entity
| |
Node为所有的dom4j中XML节点定义了多态行为
| |
NodeFilter 定义了在dom4j节点中产生的一个滤镜或谓词的行为(predicate)
| |
ProcessingInstruction 定义 XML 处理指令.
| |
Text 定义XML 文本节点.
| |
Visitor 用于实现Visitor模式.
| |
XPath 在分析一个字符串后会提供一个XPath 表达式
|
看名字大致就知道它们的涵义如何了。
要想弄懂这套接口,关键的是要明白接口的继承关系:
- interface org.dom4j.CharacterData
- interface org.dom4j.DocumentType
- interface org.dom4j.Entity
- interface org.dom4j.ProcessingInstruction
从上面的继承关系,可以看出
-Node为所有的dom4j中XML节点定义了多态行为;
-Node为所有的dom4j中XML节点定义了多态行为;
-Branch为能够包含子节点的节点如XML元素(Element)和文档(Docuemnts)定义了一个公共的行为;
|-Element 定义XML 元素;
|-Document定义了XML文档;
-DocumentType 定义XML DOCTYPE声明;
-Entity定义 XML entity;
-Attribute定义了XML的属性;
-ProcessingInstruction 定义 XML 处理指令;
-CharacterData是一个标识借口,标识基于字符的节点。如CDATA,Comment, Text;
|- CDATA 定义了XML CDATA 区域;
|-Text 定义XML 文本节点;
|- Comment 定义了XML注释的行为;
那我们现在就来看怎么使用dom4j
1.创建xml文档
要创建如下形式的xml
<data name="userInfo">
<consNo>用户编号</consNo>
<consId>用户ID</consId>
</data>从中,我们可以看出一个xml文件包含元素(element)和属性(attribute),这对于下面的解析至关重要。
Document document = DocumentHelper.createDocument();
Element root = document.addElement("data");
<pre name="code" class="java"> root.addAttribute("name", "userInfo");
Element consNo = root.addElement("consNo");
consNo.addText("1");
Element consId = root.addElement("consId");
consId.addText("2");
创建完成以后,我们可以将doucment存放到一个String中,或者一个文件中
(1)存放到String
String xmlPara= document.asXML();
(2)存放到文件
OutputFormat format = new OutputFormat(" ", true);
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("d://data.xml"), format);
xmlWriter.write(document);
2.解析xml文档
// 1.创建saxReader对象
SAXReader saxReader = new SAXReader();
//2. 通过read方法读取一个xml文件 转换成Document对象
Document doc = saxReader.read(new File("d://data.xml"));
//3.获取根节点元素对象
Element root = doc.getRootElement();
//获取根结点元素
System.out.println("root element: " + root.getName());
//获取属性的值
System.out.println("root attribute:"+root.attributeValue("name"));
//变量根结点下的所有元素
List childList = root.elements();
System.out.println("根节点下元素的个数:"+childList.size());
List childList2 = root.elements("consNo");
System.out.println("孩子结点下的元素个数:"+childList2.size());
Element consNo = root.element("consNo");
System.out.println("结点consNo对应的属性值:"+consNo.getText());
得到如下结果:
root element: data
root attribute:userInfo
根节点下元素的个数:2
孩子结点下的元素个数:1
结点consNo对应的属性值:01001
PS:1.XML中,主要有节点元素(如:data)、节点属性Attribute(如name="userInfo")和文本内容(是嵌套在2个XML标签之中的,如:用户编号)
2.XML的遍历是一层一层的,只有先获取到上一层结点,才可以获得次结点的孩子结点
3.<![CDATA[data的内容是具体的用户信息.]]>相当于注释会被解析器所忽视。