其他分享
首页 > 其他分享> > XML之dom4j解析

XML之dom4j解析

作者:互联网

简介:

dom4j的解析是从上到下的。

dom4j不是javase的一部分,所以需要导入dom4j的jar包。

首先是进入dom4j下载jar包:

https://dom4j.github.io/

下载完成后在eclipse新建一个lib文件夹:

 

 

 

将下载的jar包复制到lib文件夹中:

 

 

 复制后右击lib文件夹,选择构建路径(builder-panth),然后点配置构建路径:

 

 

 

 

 然后按照步骤(必须导入类路径):

 

 

 

 

 

 然后再跟着步骤:

 

 

 最后应用并关闭就能看到躲了一个引用的库里面有下载的jar包:

 

 

 dom4j的应用:

 首先查看org.dom4j.io下的SAXReader类:

public class SAXReader
extends Object

在SAXReader类中有一个方法

从给定的文件中读取一个文档:public Document read(File file) throws DocumentException

返回一个新创建的Document实例对象;

public interface Document
extends Branch

public interface Branch
extends Node

可以发现Document是Node接口的子接口,所以Document实例对象可以使用父接口Node的方法,

在Document中有一个方法:

返回根元素:public Element getRootElement();

在Node中有方法:

返回父节点(不存在则返回空):
    public Element getParent();
判断此节点是否支持父节点:
    public boolean supportsParent();
设置父节点(如果不支持父节点则无操作):
    public void setParent(Element parent);
返回节点的文本:
    public String getText();
判断此节点是否为只读:
    public boolean isReadOnly();
设置文本内容(节点为可写,isReadOnly为false):
    public void setText(String text);

 

案例:

用dom4j实现获取xml中节点的文本信息:

新建person.xml文档:

<?xml version="1.0" encoding="UTF-8"?>
<person>
    <p1>
        <name>zs</name>
        <age>11</age>
    </p1>
    <p1>
        <name>ls</name>
        <age>11</age>
    </p1>
</person>

获取person.xml下<name>节点的文本内容:

package dom4jDemo1;

import java.io.File;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class Dom4jParseXml {
    public static void main(String[] args) throws Exception{
        selectName();
    }
    public static void selectName() throws Exception {
        // 创建解析器
        SAXReader reader = new SAXReader();
        // 通过read()方法读取xml
        Document doc = reader.read("src" + File.separator + "dom4jDemo1" + File.separator + "dom4j1_1.xml");
        // 得到根节点
        Element rootElement = doc.getRootElement();
        // 获取p1节点
        List<Element> lists = rootElement.elements("p1");
        for (Element element : lists) {
       // Element就是p1,有两个p1 // 获取name节点 Element name = element.element("name"); // 获取name节点的文本内容 String text = name.getText(); System.out.println(text); } } }

输出结果:

通过集合的get(int index)获取索引位置的标签,然后获取标签文本内容:

package dom4jDemo1;

import java.io.File;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class Dom4jParseXml {
    public static void main(String[] args) throws Exception{
        selectName();
    }
    public static void selectName() throws Exception {
        // 创建解析器
        SAXReader reader = new SAXReader();
        // 通过read()方法读取xml
        Document doc = reader.read("src" + File.separator + "dom4jDemo1" + File.separator + "dom4j1_1.xml");
        // 得到根节点
        Element rootElement = doc.getRootElement();
        // 获取p1节点
        List<Element> lists = rootElement.elements("p1");
        // 通过List中的get()方法获取对应索引位置的元素        
        System.out.println(lists.get(0).element("age").getText());
    }
}

输出结果:

 

 

 为了体现dom4j从上到下解析的过程,新建一个方法进行重复获取:

 

 

public static void selectNameF() throws Exception {
        // 创建解析器
        SAXReader reader = new SAXReader();
        // 通过read()方法读取xml
        Document doc = reader.read("src" + File.separator + "dom4jDemo1" + File.separator + "dom4j1_1.xml");
        // 得到根节点
        Element rootElement = doc.getRootElement();
        // 获取p1
        Element p1 = rootElement.element("p1");
        // 获取p1下的name
        Element name = p1.element("name");
        // 获取name文本
        String text1 = name.getText();
        // 获取p1
        Element p1_2 = rootElement.element("p1");
        // 获取p1下的name
        Element name2 = p1_2.element("name");
        // 获取name文本
        String text2 = name2.getText();
        System.out.println(text1);
        System.out.println(text2);
    }

 

 

输出结果:

可以发现,在进行重复获取<p1>的时候并不是第一个<p1>标签进行了两次获取,而是获取一次第一个<p1>标签之后,又向下获取第二个<p1>标签,所以可以得到第一个<name>标签的文本内容和第二个<name>标签的文本内容。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

标签:XML,p1,name,dom4j,Element,节点,解析,public
来源: https://www.cnblogs.com/0099-ymsml/p/16062244.html