【XML解析】(4)Java下使用DOM4J解析方式对XML文档进行解析

DOM4J来源:

Dom4j(Document For Java)-第三方开源,是从jdom分裂出来的解析技术。目前jdom已经完全被dom4j替代。

【注意】:

①jDom – Dom4j的前身。

②Dom4j在性能和速度上都比sun公司的要快,而且支持Xpath快速查找

③目前像Spring,Hibernate这些大型的框架,都是用的dom4j.

④支持文档的读写功能和Xpath快速查询操作。

【DOM4J开源包目录】:
这里写图片描述这里写图片描述

如何学习DOM4J?

/**
*
* 学习方法:
* 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文档:

有了上面的简单了解,可以使用dom4j技术解析xml文档了。

例子:我们开始解析users.xml文档:

所要解析的xml文档:

<?xml version="1.0" encoding="UTF-8"?>
<users> 
  <user id="A001"> 
    <name>Jack</name>  
    <age>22</age> 
  </user>  
  <user id="A002"> 
    <name>张三</name>  
    <age>24</age> 
  </user>  
  <user id="B001"> 
    <name>小李</name>  
    <age>20</age> 
  </user>  
  <user id="B002"> 
    <name>小张</name>  
    <age>28</age> 
  </user>  
  <user id="0777"> 
    <name>湖南城市大学</name>  
    <age>1200</age> 
  </user>  


</users>

(一)如何通过dom4j获得dom对象?

核心代码:

SAXReader sax = new SAXReader();
Document dom = sax.read("./xml/users.xml");

★【注意】:所使用的包:org.dom4j.io

有了包,在此我们引出DOM4J的类层次:::

这里写图片描述

【特别注意】:由于之前学过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)//获取指定名称的所有子元素
     */

    // 需求:把第一个<user>的信息提取出来
    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
}
运行结果:

这里写图片描述

利用DOM4J对XML文档进行增删改查:

有了以上的基础,可以对XML文档进行一系列的操作了!

(1)增—增加最后一个元素

// 增---在root下面加一个<hncu>节点
@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-1)dom4j保存dom树

// ////////以下演示保存//////////
    // 保存----持久化----字符流要刷流
    //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();
     */

(2)删—删除最后一个元素

// 删----删除最后一个元素
@Test
public void del() throws DocumentException, IOException {
    SAXReader sax = new SAXReader();
    Document dom = sax.read("./xml/users.xml");
    Element root = dom.getRootElement();
    List<Element> 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();
}

(3)改—-修改最后一个元素

// 改----修改最后一个元素
@Test
public void update() throws Exception {
    SAXReader sax = new SAXReader();
    Document dom = sax.read("./xml/users.xml");
    Element root=dom.getRootElement();
    List<Element> 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();

}

(4)查—-遍历所有的

// 查---遍历所有的<user>
@Test
public void queryAll() throws DocumentException {
    SAXReader sax = new SAXReader();
    Document dom = sax.read("./xml/users.xml/");
    Element root = dom.getRootElement();
    Iterator<Element> 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);
    }
}

利用DOM4J创建一个新的XML文档:

// 无中生有-----利用程序创建一个新的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();
}

创建后的新xml文档:

<?xml version="1.0" encoding="UTF-8"?>
<students>
    <stud id="1406101-12">
        <name>Jack</name>
        <age>22</age>
    </stud>
</students>
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值