Dom4j(Document For Java)-第三方开源,是从jdom分裂出来的解析技术。目前jdom已经完全被dom4j替代。
【注意】:
①jDom – Dom4j的前身。
②Dom4j在性能和速度上都比sun公司的要快,而且支持Xpath快速查找
③目前像Spring,Hibernate这些大型的框架,都是用的dom4j.
④支持文档的读写功能和Xpath快速查询操作。
/**
*
* 学习方法:
* 1) 打开dom4j项目包中docs/index.html –> Quick Start –> 在这一页中介绍了dom4j的基本操作
* 2) index.html –> javadoc(1.6.1) –> 进入该版本的API文档,可以查看每个包中的类及方法的说明
* 3) 官网: http://www.dom4j.org/
*
*/
dom4j-1.6.1/docs/index.html:
Quick start:
★★从这里开始,我们能够了解到关于dom4j★★:
Parsing XML、
Using Iterators、
Powerful Navigation with XPath、
Fast Looping、
Creating a new XML document、
Writing a document to a file、
Converting to and from Strings、
Styling a Document with XSLT
Javadoc:
在这里我们就可以使用JOM4J的API了,关键的核心技术在这里都能找到,开始学习API吧!
有了上面的简单了解,可以使用dom4j技术解析xml文档了。
例子:我们开始解析users.xml文档:
<users>
<user id="A001">
<name>Jackname>
<age>22age>
user>
<user id="A002">
<name>张三name>
<age>24age>
user>
<user id="B001">
<name>小李name>
<age>20age>
user>
<user id="B002">
<name>小张name>
<age>28age>
user>
<user id="0777">
<name>湖南城市大学name>
<age>1200age>
user>
users>
核心代码:
SAXReader sax = new SAXReader();
Document dom = sax.read("./xml/users.xml");
★【注意】:所使用的包:org.dom4j.io
【特别注意】:由于之前学过DOM解析,特别容易将org.w3c.dom与org.dom4j.io包混淆,在以后的dom4j解析编程中,Node(节点),Element(元素)、Document(文档) 这些重要的内容都是从dom4j获得。
★★什么是子元素?
dom的子元素包括了:
主要是:element(),elements()
①获得单个子元素就是用以下方法获得:
element(String name)、
② 获得所有的元素用以下方法获得:
elements():List
elements(String name):List③还可以通过迭代器来获得单个元素或所有元素:
elementIterator():Iterator
elementIterator(String name):Iterator
public void helloDom4j() throws DocumentException {
// 获取DOM对象
SAXReader sax = new SAXReader();
Document dom = sax.read("./xml/users.xml");
// 获取根元素
Element root = dom.getRootElement();
// 获取根元素的name
String rootName = root.getName();
System.out.println(rootName);
/*
* 获取根元素下的子元素的一些方法: root.elements() //获取所有的子元素java.util.List
* root.element(qName)//获取指定名称的第一个元素 root.elements(qName)//获取指定名称的所有子元素
* root.elementIterator()//获取所有的元素--迭代器
* root.elementIterator(qName)//获取指定名称的所有子元素
*/
// 需求:把第一个的信息提取出来
Element eUser = root.element("user");
String id = eUser.attributeValue("id");
String name = eUser.element("name").getTextTrim();
String age = eUser.elementText("age");
System.out.println(id + "," + name + "," + age);// 结果:A001,Jack,22
}
有了以上的基础,可以对XML文档进行一系列的操作了!
// 增---在root下面加一个节点
@Test
public void add() throws DocumentException, Exception {
SAXReader sax = new SAXReader();
Document dom = sax.read("./xml/users.xml");
Element root = dom.getRootElement();
// 添加节点
Element eHncu = root.addElement("hncu");
eHncu.addAttribute("id", "0737");
Element eName = eHncu.addElement("name");
eName.addText("湖南城市学院");
Element eAge = eHncu.addElement("age");
eAge.addText("15");
// ////////////////////以下演示保存//////////////////////////////
// 保存----持久化----字符流要刷流
// 法1:简易方式-----直接通过Document中的一个writer(writer w)来实现
/*
* FileWriter fw=new FileWriter("./xml/users.xml/"); dom.write(fw);
* fw.close();
*/
// 法2:普通方式-----通过XMLwriter中的一个writer(dom)
/*
* 2.1用 构造 XMLWriter(OutputStream) XMLWriter xw=new XMLWriter(new
* FileOutputStream("./xml/users.xml")); xw.write(dom); xw.close();
*/
/*
* 2.2用 构造XMLWriter(Writer writer) XMLWriter xw=new XMLWriter(new
* FileWriter("./xml/users.xml/")); xw.write(dom); xw.close();
*/
/*
* 2.3用 构造 XMLWriter(Writer w,OutputFormat
* format)----以制定的格式输出,可以解决中文乱码问题 OutputFormat
* format=OutputFormat.createPrettyPrint(); XMLWriter xw=new
* XMLWriter(new FileOutputStream("./xml/users.xml/"), format);
* xw.write(dom); xw.close();
*/
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter xw = new XMLWriter(new FileOutputStream("./xml/users.xml/"),
format);
xw.write(dom);
xw.close();
}
// ////////////////////以下演示保存//////////////////////////////
// 保存----持久化----字符流要刷流
// 法1:简易方式-----直接通过Document中的一个writer(writer w)来实现
/*
* FileWriter fw=new FileWriter("./xml/users.xml/"); dom.write(fw);
* fw.close();
*/
// 法2:普通方式-----通过XMLwriter中的一个writer(dom)
/*
* 2.1用 构造 XMLWriter(OutputStream) XMLWriter xw=new XMLWriter(new
* FileOutputStream("./xml/users.xml")); xw.write(dom); xw.close();
*/
/*
* 2.2用 构造XMLWriter(Writer writer) XMLWriter xw=new XMLWriter(new
* FileWriter("./xml/users.xml/")); xw.write(dom); xw.close();
*/
/*
* 2.3用 构造 XMLWriter(Writer w,OutputFormat
* format)----以制定的格式输出,可以解决中文乱码问题 OutputFormat
* format=OutputFormat.createPrettyPrint(); XMLWriter xw=new
* XMLWriter(new FileOutputStream("./xml/users.xml/"), format);
* xw.write(dom); xw.close();
*/
// 删----删除最后一个元素
@Test
public void del() throws DocumentException, IOException {
SAXReader sax = new SAXReader();
Document dom = sax.read("./xml/users.xml");
Element root = dom.getRootElement();
List list = root.elements();
Element e = list.get(list.size() - 1);
e.getParent().remove(e);
// 保存
XMLWriter xw = new XMLWriter(new FileOutputStream("./xml/users.xml"));
xw.write(dom);
xw.close();
}
// 改----修改最后一个元素
@Test
public void update() throws Exception {
SAXReader sax = new SAXReader();
Document dom = sax.read("./xml/users.xml");
Element root=dom.getRootElement();
List list=root.elements();
Element eLast =list.get(list.size()-1);
eLast.addAttribute("id", "0777");
eLast.element("name").setText("湖南城市大学");
eLast.element("age").setText("1200");
XMLWriter xw=new XMLWriter(new FileOutputStream("./xml/users.xml"));
xw.write(dom);
xw.close();
}
// 查---遍历所有的
@Test
public void queryAll() throws DocumentException {
SAXReader sax = new SAXReader();
Document dom = sax.read("./xml/users.xml/");
Element root = dom.getRootElement();
Iterator it = root.elementIterator();
while (it.hasNext()) {
Element eUser = it.next();
String id = eUser.attributeValue("id");
String name = eUser.elementText("name");
String age = eUser.elementText("age");
System.out.println(id + "," + name + "," + age);
}
}
// 无中生有-----利用程序创建一个新的XML文档
@Test
public void createNewXml() throws Exception {
// 核心代码:创建出DOM即可
Document dom = DocumentHelper.createDocument();
Element root = dom.addElement("students");
Element eStud=root.addElement("stud");
eStud.addAttribute("id", "1406101-12");
eStud.addElement("name").setText("Jack");
eStud.addElement("age").setText("22");
//保存
XMLWriter xw=new XMLWriter(new FileWriter("./xml/students.xml/"));
xw.write(dom);
xw.close();
}
<students>
<stud id="1406101-12">
<name>Jackname>
<age>22age>
stud>
students>