One 许增宝

Dom4J
dom4jxml 解析器解析 xml 文档时,把 xml 文件的各个部分内容封装成对象,通过对这些对象操作 xml...
扫描右侧二维码阅读全文
26
2019/05

Dom4J

dom4j

xml 解析器解析 xml 文档时,把 xml 文件的各个部分内容封装成对象,通过对这些对象操作 xml文档,这种做法叫做 DOM 解析(DOM编程)。

Dom 解析

 Document对象,代表一个完整的 xml 文档,通过 Document 对象可以得到以下其他节点对象,通过节点对象访问 xml 文档内容。

节点信息(节点名称,节点类型)Node对象:

  • 标签节点(Element对象):

    • 标签名称
  • 属性节点(Attribute对象):

    • 属性名称
    • 属性值
  • 文本节点(Text对象):

    • 文本内容

Dom解析原理

  xml 解析器一次性把整个 xml 文档加载进内存,然后在内存中构建一颗 Document 的对象树,通过 Document 对象得到树上的节点对象,通过节点对象访问(操作)到 xml 内容。

快速入门

节点:

  • Iterator Element.nodeIterator(); //获取当前标签节点下的所有子节点

标签:

  • ElementDocument.getRootElement(); //获取xml文档的根标签
  • ElementELement.element("标签名") //指定名称的第一个子标签
  • Iterator<Element> Element.elementIterator("标签名");// 指定名称的所有子标签
  • List<Element> Element.elements(); //获取所有子标签

属性:

  • String Element.attributeValue("属性名") //获取指定名称的属性值
  • AttributeElement.attribute("属性名");//获取指定名称的属性对象
  • Attribute.getName() //获取属性名称
  • Attibute.getValue() //获取属性值
  • List<Attribute> Element.attributes(); //获取所有属性对象
  • Iterator<Attribute> Element.attibuteIterator(); //获取所有属性对象

文本:

  • Element.getText(); //获取当前标签的文本
  • Element.elementText("标签名") //获取当前标签的指定名称的子标签的文本内容

一、标签

1.读取 xml 文档,返回 Document 对象

SAXReader reader = new SAXReader();
Document doc = reader.read(new File("./src/contact.xml"));
示例:

xml:

<?xml version="1.0" encoding="UTF-8"?>
<contactList>
    <contact id="001">
        <name>张三</name>
        <age>20</age>
        <phone>12345678910</phone>
        <qq>1234124231</qq>
    </contact>
    <contact id="002">
        <name>张三</name>
        <age>20</age>
        <phone>12345678910</phone>
        <qq>1234124231</qq>
    </contact>
</contactList>

Java:

public static void main(String[] args) throws Exception{
        // 1.读取xml文档,返回Document对象
        SAXReader reader = new SAXReader();
        Document doc = reader.read(new File("./src/contact.xml"));

        // 2.nodeIterator(): 得到档期那节点下所有子节点对象
        Iterator<Node> it = doc.nodeIterator();
        while(it.hasNext()){ // 判断是否存在下一个元素
            Node node = it.next();  // 取出元素
            String name = node.getName();
            System.out.println(name);

            // 继续取出其下面的子节点
            // 只有标签节点才有子节点
            // 判断当前节点是否是标签节点
            if(node instanceof Element){
                Element elem = (Element)node;
                Iterator<Node> it2 = elem.nodeIterator();
                while(it2.hasNext()){
                    Node node2 = it2.next();
                    System.out.println(node2.getName());
                }
            }
        }
    }

2.遍历获取所有子节点

import java.io.File;
import java.util.Iterator;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

public class DemDOM4J {

    public static void main(String[] args) throws Exception {
        DemDOM4J dem = new DemDOM4J();
        dem.rootEle();
    }

    public void rootEle() throws DocumentException {
        SAXReader reader = new SAXReader();
        Document doc = reader.read(new File("./src/contact.xml"));
        getChildNodes(doc.getRootElement());        // 获取根节点
    }


    private void getChildNodes(Element element){
        Iterator<Node> it = element.nodeIterator();
        while (it.hasNext()){
            Node node = it.next();
            if (node instanceof Element){
                Element elem = (Element) node;
                System.out.println(elem.getName());
                getChildNodes(elem);
            }
        }
    }
}

输出结果:

           contact
           name
           age
           phone
           qq
           contact
           name
           age
           phone
           qq

3.获取子节点(不包含子节点以下的节点)

public static void main(String[] args) throws Exception {
        SAXReader reader = new SAXReader();
        Document doc = reader.read(new File("./src/contact.xml"));
        Element element = doc.getRootElement();

        // 获取当前标签下的第一个子标签
        Element element1 = element.element("contact");
        System.out.println("获取当前标签下的第一个子标签: " + element1.getName());


        // 获取当前标签下指定名字的所有子标签
        Iterator<Element> it = element.elementIterator("contact");
        while (it.hasNext()){
            System.out.println("获取当前标签下指定名字的所有子标签: " + it.next().getName());
        }


        // 获取当前标签下所有子标签
        List<Element> elements = element.elements();
        for (int i = 0; i < elements.size(); i++){
            System.out.println("获取当前标签下所有子标签: " + elements.get(i).getName());
        }
        
        /*
        * 获取当前标签下的第一个子标签: contact
        * 获取当前标签下指定名字的所有子标签: contact
        * 获取当前标签下指定名字的所有子标签: contact
        * 获取当前标签下所有子标签: contact
        * 获取当前标签下所有子标签: contact
        * 获取当前标签下所有子标签: abc
        * 获取当前标签下所有子标签: xyz
        * */

4.获取更深层次的标签

  SAXReader reader = new SAXReader();
        Document doc = reader.read(new File("./src/contact.xml"));
        Element element = doc.getRootElement();

        // 获取更深层次的标签
        Element ele = element.element("contact").element("name");
        System.out.println(ele.getName());

        // 输出结果:name

二、属性

1.获取标签的指定属性值

// 先获取标签对象
        Element ele = element.element("contact");
        String attValue = ele.attributeValue("id");
        System.out.println(attValue);
2.获取指定属性名称对象

Element ele = element.element("contact");
// 获取指定属性名称对象
Attribute idAttr = ele.attribute("id");
System.out.println(idAttr.getName() + "=" + idAttr.getValue());
System.out.println();
3.得到所有属性对象 (还有一种迭代器获取方式)

 List<Attribute> list = ele.attributes();
        for (Attribute attr : list){
            System.out.println(attr.getName() + "=" + attr.getValue());
        }

三、文本

1.先获取标签,在获取标签上的文本

SAXReader reader = new SAXReader();
Document doc = reader.read(new File("./src/contact.xml"));
// 先获取标签,在获取标签上的文本
Element element = doc.getRootElement().element("contact").element("name");
String text = element.getText();
System.out.println(text);

2.得到指定标签名文本内容

SAXReader reader = new SAXReader();
Document doc = reader.read(new File("./src/contact.xml"));
// 得到指定标签名文本内容
String text1 = doc.getRootElement().element("contact").elementText("name");
System.out.println(text1);
最后修改:2019 年 05 月 26 日 01 : 59 AM

发表评论