Dom4j:
Dom SUN
dom在加载时,将所有元素全部加载内存
DOM4j - 第三方。
Dom4j是一个开源、灵活的XML API。
目前很多开源框架如struts,hibernate都使用dom4j做为解析其xml的工具。
支持文档的读写功能和Xpath快速查询操作。
这个需要我们自己把它的包导入myeclipse中的。
准备DOM4j:
包:dom4j.x.jar
包结构:
org.dom4j
类
org.dom4j.io.SAXReader – xml文档解析器
org.dom4j.Document、Element – 文档对像
需要知道的 Element的一些方法
Element.element(“name”) –此元素下的第一个name元素。
Element.elementIterator(“name”) – 此元素下的所有name元素。返回Iterator
Element.getText() – 返回元素包含的文本。
Element.getAttribute(“name”) – 返回名称为name的属性。
Element.addElement(“name”); - 添加一个name元素,同时返回name元素本身。
org.dom4j.io.XMLWriter – 将Document写出的对像。
DOM4J的层次图:

使用UTF-8编码,解决中文乱码:
Dom4j-保存节点-处理中文乱码:
记住:删除一个节点时,要用它的父节点删除它。
添加或修改属性的方法:addAttribute
Dom4j-从没有到有生成一个新的xml:
Document doc = DocumentHelper.createDocument();
doc.setXMLEncoding(“UTF-8”);
Element root = doc.addElement(“users”);
Xpath
XML PATH Language。
可以实现快速查询。
XPATH包含
XPath 使用路径表达式在 XML 文档中进行导航 。
XPath 包含一个标准函数库
准备Xpath的包:
jaxen.jar
Xpath通过以下方法使用
dom.selectNodes – 返回一个 List对像
dom.selectSingleNode – 返回一个Node对像
List<Element> list = doc.selectNodes("//user");
System.err.println(list.size());
list = doc.selectNodes("//name");
System.err.println(list.size());
list = doc.selectNodes("//user[@country]");
System.err.println(list.size());
Node node = doc.selectSingleNode("//user[@country=\"EN\"]");
System.err.println(node);
Xpath通过查询子元素的值,区别主要元素:
如:XML文档如下:
<books>
<book id=“A001”>
<name>Oracle编程基础</name>
<price>89.99</price>
</book>
</books>
查询包含Oracle一词的所有book元素。
这个稍微了解一下:
Xpath处理带有命名空间的XML文档:

SAXReader sax = new SAXReader();
Map<String,String> uris = new HashMap<String, String>();
uris.put("a", "http://www.itcast.cn");
sax.getDocumentFactory().setXPathNamespaceURIs(uris);
Document dom = sax.read("./xml2/a.xml");
dom.selectNodes(“
dom.selectNodes(
dom.seletNodes(“
SAX,StAX读取速度快。都是JAXP的成员。
StAX-Iterator编程接口和Cursor编程接口。
Dom4j。Dom。都会将所有节点加载加载到内存中。CRUD非常方便。
Dom4j支持XPath.
演示代码:::
package cn.hncu.dom4j
import java.io.FileNotFoundException
import java.io.FileOutputStream
import java.io.FileWriter
import java.io.IOException
import java.io.UnsupportedEncodingException
import java.util.Iterator
import java.util.List
import java.util.Scanner
import org.dom4j.Document
import org.dom4j.DocumentException
import org.dom4j.DocumentHelper
import org.dom4j.Element
import org.dom4j.io.OutputFormat
import org.dom4j.io.SAXReader
import org.dom4j.io.XMLWriter
import org.junit.Test
public class Dom4jDemo {
@Test
public void readDemo() throws Exception{
//声明SAXReader核心读取(xml)类,并获得dom对象
SAXReader sax = new SAXReader()
Document dom = sax.read("xml5/users.xml")
//获取根节点
Element root = dom.getRootElement()
//获取里面的第一个子元素
Element user = root.element("user")
String id = user.attributeValue("id")
System.out.println(id)
String name = user.element("name").getText()
String age = user.elementText("age")
System.out.println(name+","+age)
}
//显示(遍历)所有用户
@Test
public void readAll() throws Exception{
SAXReader reader = new SAXReader()
Document document = reader.read("xml5/users.xml")
Element root = document.getRootElement()
Iterator<Element> it = root.elementIterator()
while(it.hasNext()){
Element e = it.next()
String id = e.attributeValue("id")
String name = e.elementText("name")
String age = e.element("age").getText()
System.out.println("id:"+id+",name:"+name+",age:"+age)
}
}
//添加一个user元素
@Test
public void addElement() throws Exception{
SAXReader sax= new SAXReader()
Document document = sax.read("xml5/users.xml")
Element root = document.getRootElement()
Element e = root.addElement("user")
e.addAttribute("id", "C003")
Element eName = e.addElement("name")
eName.setText("张三")
Element eAge = e.addElement("age")
eAge.setText("24")
//要把内存中的dom对象写到磁盘中
//法一---功能有限
// FileWriter fw = new FileWriter("xml5/users.xml")
// document.write(fw)
// fw.close()
//法二---功能更强
OutputFormat format = OutputFormat.createCompactFormat()
format.setEncoding("utf-8")
XMLWriter writer = new XMLWriter(new FileWriter("xml5/users.xml"), format)
//以指定的输出格式,把dom输出到指定的目的地(文件)
writer.write(document)
writer.close()
}
//删除最后一个user元素
@Test
public void delElement() throws Exception{
SAXReader reader = new SAXReader()
Document document = reader.read("xml5/users.xml")
Element root = document.getRootElement()
List<Element> list = root.elements()
Element e = list.get(list.size()-1)
e.getParent().remove(e)
//保存
XMLWriter writer = new XMLWriter(new FileWriter("xml5/users.xml"))
writer.write(document)
writer.close()
}
//从零开始创建一个xml文档
@Test
public void createNewXml() throws IOException, FileNotFoundException{
Document document = DocumentHelper.createDocument()
Element root = document.addElement("hncu")
root.addElement("department").addAttribute("id", "hncu001").addElement("xky").setText("信息科学与工程学院")
//保存
XMLWriter writer = new XMLWriter(new FileOutputStream("xml5/hncu.xml"))
writer.write(document)
writer.close()
}
//xpath的用法
@Test
public void xpathDemo() throws Exception{
SAXReader sax = new SAXReader()
Document dom = sax.read("xml5/contact.xml")
//String xpath = "/*/name"
//String xpath="//contact/name"
//String xpath="//aaa/preceding::*"
String xpath="//*[@id]"
Element root = dom.getRootElement()
System.out.println(root.getName())
List<Element> list = root.selectNodes(xpath)
for(Element e:list){
System.out.println(e.getName()+"--"+e.getText())
}
}
//xpath用法
@Test
public void xpathDemo2() throws Exception {
SAXReader sax = new SAXReader()
Document dom = sax.read("xml5/contact.xml")
Scanner sc = new Scanner(System.in)
String name =sc.next()
//name=name.toLowerCase()
String pwd = sc.next()
//String xpath="//user[@name][@pwd]"
//String xpath="//user[@name='Jack'][@pwd='1234']"
//String xpath="//user[@name='"+name+"'][@pwd='"+pwd+"']"
String xpath="//user[fn:lower-case(@name)='"+name+"'][@pwd='"+pwd+"']"
System.out.println(xpath)
List<Element> list = dom.selectNodes(xpath)
for(Element e:list){
System.out.println(e.getName())
List<Element> eList = e.selectNodes("//contact/name")
for(Element e2:eList){
System.out.println(e2.getText())
}
}
}
}