欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Dom4J结合XPath解析XML

程序员文章站 2022-05-28 21:02:33
...

介绍

XPath 使用路径表达式来选取HTML\XML 文档中的元素节点或属性节点。节点是通过沿着路径 (path) 来选取的。XPath在解析HTML\XML文档方面提供了独树一帜的路径思想.

XPath使用步骤

步骤1:导入jar包(dom4j和jaxen-1.1-beta-6.jar)

步骤2:通过dom4j的SaxReader解析器对象,读xml文件,生成Document对象

步骤3: 利用Xpath提供的api,对XML文档中的标签或者属性进行解析操作。

document常用的api

  • document.selectSingleNode(String xpath); 获得一个节点(标签\元素)
  • document.selectNodes(String xpath); 获得多个节点(标签\元素)

XPath语法(了解)

  • XPath表达式,就是用于选取HTML文档中节点的表达式字符串。
    获取XML文档节点元素一共有如下4种XPath语法方式:
    1. 绝对路径表达式方式 以/开头,从根标签开始的完整路径 例如: /元素/子元素/子子元素…
    2. 相对路径表达式方式 例如: 子元素/子子元素… 或者 ./子元素/子子元素…
    3. 全文搜索路径表达式方式 例如: //子元素//子子元素
    4. 谓语(条件筛选)方式 例如: //元素[@attr1=value]

代码

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

<天气预报>
    <北京 provide='' id='1'>
        <温度>
            <最高温度 level="A">18</最高温度>
            <最低温度>6</最低温度>
        </温度>
        <湿度>20%</湿度>
    </北京>


    <深圳>
        <温度>
            <最高温度 level="C">36</最高温度>
            <最低温度>24</最低温度>
        </温度>
        <湿度>50%</湿度>
    </深圳>

	
	 <广州>
	 
		<温度>
            <最高温度 level="C">32</最高温度>
            <最低温度>21</最低温度>
        </温度>
        <湿度>50%</湿度>
		
		<黄浦区>
			<温度>
				<最高温度 level="C">31</最高温度>
				<最低温度>22</最低温度>
			</温度>
			<湿度>50%</湿度>
		</黄浦区>
		
		<天河区>
			<温度>
				<最高温度 level="C">30</最高温度>
				<最低温度>26</最低温度>
			</温度>
			<湿度>50%</湿度>
		</天河区>


    </广州>
</天气预报>
public class Test {
    public static void main(String[] args) throws Exception {
        /*
            Dom4J结合XPath解析XML:
                  XPath使用步骤:
                    步骤1:导入jar包(dom4j和jaxen-1.1-beta-6.jar)
                    步骤2:通过dom4j的SaxReader解析器对象,获取Document对象
                    步骤3:利用Xpath提供的api,结合xpath的语法完成选取XML文档元素节点进行解析操作。
                 document\Element常用的api
                    - Node selectSingleNode(String xpath);   获得一个节点(标签,元素),传入符合XPATH语法的节点路径
                    - Node selectNodes(String xpath);      获得多个节点(标签,元素),传入符合XPATH语法的节点路径
                 XPATH路径语法:
                    1. 绝对路径表达式方式	     例如: /元素/子元素/子子元素...
                        以/开头的路径叫做是绝对路径,绝对路径要从根元素开始写

                    2. 相对路径表达式方式          例如: 子元素/子子元素..  或者 ./子元素/子子元素..
                        相对路径就是相对当前节点元素位置继续查找节点,不以/开头, ../ 表示上一个元素, ./表示当前元素

                    3. 全文搜索路径表达式方式  例如: //子元素//子子元素...   //子元素/子子元素...
                        代表不论中间有多少层,直接获取所有子元素中满足条件的元素

                    4. 谓语(条件筛选)方式      例如: //元素[@属性名=属性值]
                        根据条件过滤判断进行选取节点
         */
        // 1.创建解析器对象
        SAXReader sr = new SAXReader();

        // 2.读取xml文件,生成Document对象
        Document d = sr.read("day14\\tianqi.xml");

        // 绝对路径表达式方式: 获取广州天河区的湿度标签的文本
        // 1.获得湿度标签
        // Element继承Node
        Element e1 = (Element) d.selectSingleNode("/天气预报/广州/天河区/湿度");

        // 2.根据湿度标签获得文本
        System.out.println("e1:" + e1.getText());// 50%

        // 相对路径表达式方式: 相对于e1标签,获取深圳的湿度
        Element e2 = (Element)e1.selectSingleNode("../../../深圳/湿度");
        System.out.println("e2:" + e2.getText());

        // 全文搜索路径表达式方式: 所有的最高温度
        List<Element> list = d.selectNodes("//最高温度");
        for (Element e : list) {
            System.out.println(e.getName()+",文本:"+e.getText()+",属性:"+e.attributeValue("level"));
        }
        System.out.println("===================");
        // 谓语(条件筛选)方式 : 获取所有最高温度等级为C的标签
        List<Element> list1 = d.selectNodes("//最高温度[@level='C']");
        for (Element e : list1) {
            System.out.println(e.getName()+",文本:"+e.getText()+",属性:"+e.attributeValue("level"));
        }
    }
}