成都校区Dom4J解析XML的范例浅析

Posted 黑马程序员成都中心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了成都校区Dom4J解析XML的范例浅析相关的知识,希望对你有一定的参考价值。


前言

XML是可扩展标记语言的缩写,在编程领域是非常常用的,我们经常会用它进行数据的传输或者用作配置文件,那么对XML的操作的也会是我们需要掌握的一项技术,本文会使用Java语言,利用DOM4J这个非常优秀的开源库,探讨生成XML格式数据和解析XML数据的两个方面的问题。


1. Dom4J简介

在Dom4j.org上,是这么介绍的:Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT。它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。

 

简单来说,Dom4j具有性能优秀,操作简单的优点

2. Dom4j的使用

 

2.1 导入jar包

这个操作非常简单,我们可以在网上下载jar包,或者在https://sourceforge.net/projects/dom4j/?source=directory下载了dom4j项目之后,解压缩成jar包,然后导入项目中

2.2 案例一:用Java代码生成xml文档

代码思路:我们要生成一个XML文档,其实就像我们平时书写文档是一样的道理:

 

创建文档 -> 创建根元素 -> 添加根元素

子元素也是先创建再添加到其他元素中

如果元素上有属性则先添加属性


下面直接上代码


import java.io.FileOutputStream;

import java.io.FileWriter;

 

import org.dom4j.Document;

import org.dom4j.DocumentHelper;

import org.dom4j.Element;

import org.dom4j.io.OutputFormat;

import org.dom4j.io.XMLWriter;

public class Dom4JTest1 {

 

    public static void main(String[] args) throws Exception {

        // 第一种方式:创建文档,并创建根元素

        // 创建文档:使用了一个Helper类

        Document document = DocumentHelper.createDocument();

 

        // 创建根节点并添加进文档

        Element root = DocumentHelper.createElement("student");

        document.setRootElement(root);

 

        // 第二种方式:创建文档并设置文档的根元素节点

        Element root2 = DocumentHelper.createElement("student");

        Document document2 = DocumentHelper.createDocument(root2);

 

        // 添加属性

        root2.addAttribute("name", "zhangsan");

        // 添加子节点:add之后就返回这个元素

        Element helloElement = root2.addElement("hello");

        Element worldElement = root2.addElement("world");

 

        helloElement.setText("hello Text");

        worldElement.setText("world text");

 

        // 输出

        // 输出到控制台

        XMLWriter xmlWriter = new XMLWriter();

        xmlWriter.write(document);

        // 输出到文件

        // 格式

        OutputFormat format = new OutputFormat("    ", true);// 设置缩进为4个空格,并且另起一行为true

        XMLWriter xmlWriter2 = new XMLWriter(

                new FileOutputStream("student.xml"), format);

        xmlWriter2.write(document2);

 

        // 另一种输出方式,记得要调用flush()方法,否则输出的文件中显示空白

        XMLWriter xmlWriter3 = new XMLWriter(new FileWriter("student2.xml"),

                format);

        xmlWriter3.write(document2);

        xmlWriter3.flush();

        // close()方法也可以

 

    }

}

程序Console输出:

<?xml version="1.0" encoding="UTF-8"?>

<student/>

  生成的一个xml文档:

 

<?xml version="1.0" encoding="UTF-8"?>

 

<student name="zhangsan">

    <hello>hello Text</hello>

    <world>world text</world>

</student>

 

小总结到目前为止我们已经完成了对一个xml格式数据的生成,如果要生成其他样式的数据,也是比较类似的操作,本文就不再赘述了。

2.3 案例二:读入xml文档并分析,将其内容输出

 

了解了实现思想后,我们就直接改写顺序查找算法,用二分查找思想来实现查找

首先,待分析的文档如下:

<?xml version="1.0" encoding="UTF-8"?>

<students name="zhangsan">

    <hello name="lisi">hello Text1</hello>

    <hello name="lisi2">hello Text2</hello>

    <hello name="lisi3">hello Text3</hello>

    <world name="wangwu">world text1</world>

    <world name="wangwu2">world text2</world>

    <world >world text3</world>

</students>

代码思路:由外而内的取获取节点读取数据

 

获取整个文档

获取根元素students

遍历根元素students获取每个子元素

然后通过元素拿到对应的名称、属性值等数据


以下是代码实现

import java.io.File;

import java.util.Iterator;

import java.util.List;

 

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

 

import org.dom4j.Document;

import org.dom4j.Element;

import org.dom4j.io.DOMReader;

import org.dom4j.io.SAXReader;

 

public class Dom4JTest2 {

    public static void main(String[] args) throws Exception {

        SAXReader saxReader = new SAXReader();

                // 获取文档对象       

        Document document = saxReader.read(new File("students.xml"));

// 获取根元素

        Element root = document.getRootElement();

        System.out.println("Root: " + root.getName());

 

        // 获取所有子元素

        List<Element> childList = root.elements();

        System.out.println("total child count: " + childList.size());

 

        // 获取特定名称的子元素

        List<Element> childList2 = root.elements("hello");

        System.out.println("hello child: " + childList2.size());

 

        // 获取名字为指定名称的第一个子元素

        Element firstWorldElement = root.element("world");

        // 输出其属性

        System.out.println("first World Attr: "

                + firstWorldElement.attribute(0).getName() + "="

                + firstWorldElement.attributeValue("name"));

        System.out.println("迭代输出-----------------------");

 

        // 迭代输出

        for (Iterator iter = root.elementIterator(); iter.hasNext();) {

            Element e = (Element) iter.next();

            System.out.println(e.attributeValue("name"));               

        }

 

        System.out.println("用DOMReader-----------------------");

        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

        DocumentBuilder db = dbf.newDocumentBuilder();

        // 注意要用完整类名

        org.w3c.dom.Document document2 = db.parse(new File("students.xml "));       

        DOMReader domReader = new DOMReader();

 

        // 将JAXP的Document转换为dom4j的Document

        Document document3 =domReader.read(document2);

Element rootElement = document3.getRootElement();

        System.out.println("Root: " + rootElement.getName());

    }

}


控制台输出:


Root: studentstotal child count: 6hello child: 3first World Attr: name=wangwu迭代输出-----------------------lisilisi2lisi3wangwuwangwu2null用DOMReader-----------------------Root: students


3. 总结

到目前为止我们已经用Dom4j完成了生成XML文档以及解析XML文档的操作,相信大家已经对Dom4j有了一定的了解,更复杂的XML只是操作起来步骤更多而已,其思路都是类似的。祝大家学有所成


以上是关于成都校区Dom4J解析XML的范例浅析的主要内容,如果未能解决你的问题,请参考以下文章

dom4j解析Xml,dom4j解析带命名空间的Xml内容,dom4j解析xml为实体类

dom4j解析xml重复节点

200分求解:dom4j 使用XPATH解析。。诡异的问题

关于dom4j 解析xml文件的问题

Java案例:利用dom4j解析XML文件

dom4j的介绍