使用dom4j解析xml

1 使用dom4j解析xml

1.1 基本步骤

1.读取xml,得到Document对象
2.从Document里得到根节点对象
3.遍历dom树,找需要的标签
4.得到标签上的数据:属性值、标签体

1.2 相关的类

  • 解析器:读取xml的,得到Document对象

    • SAXReader:使用sax方式读取xml,最终构建一棵dom树

    • DOMReader:使用dom方式读取xml,最终构建一棵dom树

SAXReader reader = new SAXReader();
Document document = reader.read(InputStream is);
  • 从Document里得到根标签:

    • document.getRootElement()

  • 从任意一标签里得到子标签

    • element.elements():获取所有的子标签,得到List

    • element.elements(String elementName):获取所有指定名称的子标签,得到List

    • element.element(String elementName):获取第一个指定名称的子标签,得到Element

  • 从标签上得到数据:

    • element.getText():得到标签里的内容

    • element.attributeValues(String attrName):获取指定名称的属性值

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;

import java.io.InputStream;
import java.util.List;

/**
 * 使用dom4j解析xml
 */
public class Demo01Dom4jParse {

    /**
     * 获取每个学生的姓名
     * @throws DocumentException
     */
    @Test
    public void test1() throws DocumentException {
        //1.读取xml,得到Document对象
        SAXReader reader = new SAXReader();
        InputStream inputStream = Demo01Dom4jParse.class.getClassLoader().getResourceAsStream("01xml/students.xml");
        Document document = reader.read(inputStream);

        //System.out.println(document);

        //2. 从Document里得到根节点
        Element rootElement = document.getRootElement();
        //System.out.println(rootElement);

        //3. 从根节点里得到所有的子标签student
        //List<Element> elements = rootElement.elements();
        List<Element> elements = rootElement.elements("student");
        for (Element element : elements) {
            //System.out.println(element);

            //4. 获取每个student里的第一个name标签
            Element name = element.element("name");
            //System.out.println(name);
            //5. 获取name标签里的内容
            String nameText = name.getText();
            System.out.println(nameText);

            //6. 获取每个student里的第个description标签,得到内容
            String description = element.element("description").getText();
            System.out.println(description);

            //7. 获取每个student的id属性值:学号
            String id = element.attributeValue("id");
            System.out.println(id);

            System.out.println("---------------------------------------");
        }

        /*Element element = rootElement.element("teacher");
        System.out.println(element);*/
    }
}

 

2 使用xpath简化dom4j

2.1 常见xpath写法(了解)

/a/b/c:  找根标签a下的b标签,b标签下的c标签。 最终找的是符合条件的c标签
//a:     全文搜索a标签
​
//a[1]:  全文搜索a标签,只要第1个
//a[last()]:全文搜索a标签,只要最后一个
//@id:   全文搜索id属性
//a[@id]:全文搜索含有id属性的a标签
​
//a[@id="a1"]:全文搜索a标签,但是只要id属性值为a1的
​
/a/*:    找根标签a下所有的子标签
//*:     全文搜索所有标签
//a[@*] :  全文搜索有属性的a标签
//a[not(@*)]:全文搜索没有属性的a标签

2.2 dom4j使用xpath

  • 步骤:导入jar包(dom4j的jar包,jaxen的jar包)

1. 读取xml文件,得到Document对象
2. 使用Document的方法,执行xpath表达式,得到结果
  • 相关的方法:

    • Document里执行xpath的方法:

      • document.selectNodes(String xpath):得到所有符合xpath的节点集合,得到List<Node>

      • document.selectSingleNode(String xpath):得到第一个符合xpath的节点对象,得到Node对象

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;

import java.io.InputStream;

/**
 * dom4j结合xpath表达式,查找标签。
 * 例如:
 *  要求得到students.xml里id为002的学生姓名。xpath是: //student[@id="002"]/name
 *  要求得到c3p0-config.xml里,名称为heima的配置的驱动类名。xpath是://named-config[@name="heima"]/property[@name="driverClass"]
 */
public class Demo01XpathParse {
    /**
     * 要求1:查询得到student.xml里所有的姓名   xpath表达式: //name
     * 要求2:查询得到student.xml里所有的学生姓名  xpath表达式://student/name
     *
     */
    @Test
    public void test1() throws DocumentException {
        //1.得到Document对象
        SAXReader reader = new SAXReader();
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("01xml/students.xml");
        Document document = reader.read(inputStream);

        //2.直接执行xpath表达式: //name
        //List<Node> nodes = document.selectNodes("//name");
        /*List<Node> nodes = document.selectNodes("//student/name");
        for (Node node : nodes) {
            Element element = (Element) node;

            String name = element.getText();
            System.out.println("姓名:" + name);
        }*/


        //3.得到第一个学生的姓名  //student/name
        Element element = (Element) document.selectSingleNode("//student/name");
        System.out.println(element.getText());
    }
}

 

3 dom4j解析和xpath解析对比

  • 如果要解析xml,得到里边配置的所有数据:建议用dom4j,层层迭代遍历所有

  • 如果要解析xml,只要里边的一部分数据:建议使用xpath,使用xpath表达式直接定位到节点,不需要层层迭代

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值