DOM4J解析XML文档:
█ Dom4j是一个简单、灵活的开放源代码的库。Dom4j是由早期开发JDOM的人分离出来而后独立开发的。与JDOM不同的是,dom4j使用接口和抽象基类,虽然Dom4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性。
█ Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j。
█ 使用Dom4j开发,需下载dom4j相应的jar文件。
Document对象: | 节点对象: |
DOM4j中,获得Document对象的方式有三种:
1.读取XML文件,获得document对象
SAXReader reader = new SAXReader();
Document document = reader.read(url);
2.解析XML形式的文本,得到document对象.
String text = "<members></members>";
Document document = DocumentHelper.parseText(text);
3.主动创建document对象.
Document document = DocumentHelper.createDocument(); //创建根节点
Element root = document.addElement("members");
|
1.获取文档的根节点.
Element root = document.getRootElement();
2.取得某个节点的子节点.
Element element=node.element(“书名");
element.element("售价");
3.取得节点的文字
String text=node.getText();
|
节点对象: | 节点对象属性 |
4.取得某节点下所有名为“member”的子节点,并打印出来。
List nodes = rootElm.elements("member");
5.在某节点下添加子节点。
Element ageElm = newMemberElm.addElement("age");
6.设置节点文字。
element.setText("29");
7.删除某节点。//childElm是待删除的节点,parentElm是其父节点
parentElm.remove(childElm);
8.添加一个CDATA节点。
Element contentElm = infoElm.addElement("content");contentElm.addCDATA(diary.getContent());
|
1.取得某节点下的某属性
Element root=document.getRootElement(); //属性名name
Attribute attribute=root.attribute("size");
2.取得属性的文字
String text=attribute.getText();
3.删除某属性
Attribute attribute=root.attribute("size"); root.remove(attribute);
4.获取某节点的所有属性
Element root=document.getRootElement();
List attributes =root.attributes();
5.设置某节点的属性和文字。
newMemberElm.addAttribute("name", "sitinspring");
6.设置属性的文字
Attribute attribute=root.attribute("name");
attribute.setText("sitinspring");
|
将文档写入XML文件
1.文档中全为英文,不设置编码,直接写入的形式。
XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));
writer.write(document); writer.close();
|
2.文档中含有中文,设置编码格式写入的形式。
OutputFormat format = OutputFormat.createPrettyPrint(); // 指定XML编码
format.setEncoding("utf-8");
XMLWriter writer = new XMLWriter(new FileOutputStream ("output.xml"),format);
writer.write(document);
writer.close();
|
Books.xml | Dom4j.java |
<?xml version="1.0" encoding="utf-8" ?>
<书架>
<书>
<书名 id="001">浪潮之巅</书名>
<作者>吴军</作者>
<售价>29</售价>
</书>
<书>
<书名 id='002'>数学之美</书名>
<作者>吴军</作者>
<售价><第一版>29</第一版></售价>
</书>
</书架>
|
package com.java.dom4j;
import java.io.FileOutputStream;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class Dom4jDemo {
public static void main(String[] args) throws Exception {
|
//这里要导入第三方架包,右键->新建文件夹(lib),把dom4j-1.6.1.jar拷贝进来;然后选中右键->构建路径->添加到构建路径,资源下回出现“引用的库”,这时候才能点开架包使用
//做完上面的操作,写代码系统就会提示导入刚才加架包
//通过saxreader获取document对象
SAXReader reader = new SAXReader();
Document document = reader.read("Books.xml");
//按照dom的方式进行操作
/*1、得到某个具体的节点内容
2、打印某节点的所有元素节点
3、修改某个元素节点的主体内容
4、向指定元素节点中增加子元素节点
5、向指定元素节点上增加同级元素节点
6、删除指定元素节点
7、操作XML文件属性*/
|
//获取某个具体的节点内容,得到第一本书的售价
Element root=document.getRootElement();
Element firstBookelement=root.element("书"); //这个方法时找出满足条件的第一个元素返回
Element priceElement = firstBookelement.element("售价");
String price = priceElement.getText();
System.out.println("Dom4jDemo.main()"+price);
//打印某节点的所有元素节点 打印第二本书的所有元素节点
//dom4j自动过滤空行
List elements = root.elements(); //这里的list只有两个元素,因为就两本书;这里返回的List集合里装的元素类型是Element
Element secondBookElement=(Element) elements.get(1); //List默认类型是object,所以这里get()返回的是Object;这里要向下转型
List secondBookchild = secondBookElement.elements();
System.out.println("Dom4JDemo.main()"+secondBookchild.size());
for(int i=0;i<secondBookchild.size();++i){
Element child = (Element)secondBookchild.get(i);
System.out.println(child.getName());
}
|
//修改某个节点的主题内容 把第二本书的名字改《java编程思想》
Element secondBookName=(Element)secondBookchild.get(0);
secondBookName.setText("java编程思想"); //内存中改,还没有保存到文件中
System.out.println(secondBookName.getText());
//向指定元素节点中增加子元素节点 往第一本书里增加一个销量子节点
Element addElement=firstBookelement.addElement("销量"); //这个直接增加到最后
addElement.setText("1000");
|
//向指定元素节点上增加同级元素节点 第二本书的 售价 之前增加一个上架分类 计算机
Element element=DocumentHelper.createElement("上架分类"); //这里区别于上面的addElement(),不能直接添加,要先创建,再在指定位置插入
element.setText("计算机");
secondBookchild.add(2, (Object)element); //这里只是插入到了List集合里,写回文件的时候才生效
//删除指定元素节点
secondBookElement.remove(element);
|
//操作XML文件属性
String xmlEncoding = document.getXMLEncoding();
System.out.println("Dom4JDemo.main()"+xmlEncoding);
//标准的保存语句。
//dom4j写回文档会自动写换行方便观看
OutputFormat format = OutputFormat.createPrettyPrint(); // 指定XML编码
format.setEncoding("utf-8");
XMLWriter writer = new XMLWriter(new FileOutputStream ("output.xml"),format);
writer.write(document);
writer.close();
}
}
|
output.xml <?xml version="1.0" encoding="utf-8"?>
<书架>
<书>
<书名 id="001">浪潮之巅</书名>
<作者>吴军</作者>
<售价>29</售价>
<销量>1000</销量>
</书>
<书>
<书名 id="002">java编程思想</书名>
<作者>吴军</作者>
<售价>
<第一版>29</第一版>
</售价>
</书>
</书架>
|
指定位置增加上架分类,计算机 |
最终控制台结果 |