xPath技术

引入xPath技术解决什么问题:当使用dom4j查询比较深的层次结构的节点(标签,属性,文本),比较麻烦!!!

 xPath作用:主要是用于快速获取所需的节点对象。


在dom4j中如何使用xPath技术

 1)导入xPath支持jar包 。  jaxen-1.1-beta-6.jar

 2)使用xpath方法

 List<Node>  selectNodes("xpath表达式");   查询多个节点对象

Node       selectSingleNode("xpath表达式");  查询一个节点对象

 xPath语法

                                    /      绝对路径      表示从xml的根位置开始或子元素(一个层次结构)

                                    //     相对路径       表示不分任何层次结构的选择元素。

                                    *      通配符         表示匹配所有元素

                                    []      条件           表示选择什么条件下的元素

                                    @     属性            表示选择属性节点

                                    and     关系          表示条件的与关系(等价于&&)

                                    text()    文本           表示选择文本内容

示例代码:

import java.io.File;
import java.io.FileOutputStream;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

/**
 * 第一个xpath程序
 * @author APPle
 *
 */
public class Demo1 {

    
    public static void main(String[] args) throws Exception{
        /**
         * 需求: 删除id值为2的学生标签
         */
        Document doc = new SAXReader().read(new File("e:/student.xml"));
        
        //1.查询id为2的学生标签
        //使用xpath技术
        Element stuElem = (Element)doc.selectSingleNode("//Student[@id='2']");

        //2.删除标签
        stuElem.detach();
        
        //3.写出xml文件
        FileOutputStream out = new FileOutputStream("e:/student.xml");
        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("utf-8");
        XMLWriter writer = new XMLWriter(out,format);
        writer.write(doc);
        writer.close();
    }

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

import java.io.File;
import java.io.IOException;
import java.util.List;

public class Demo1 {
    //xPath表达式语法
    public static void main(String[] args) throws DocumentException, IOException {
        Document doc = new SAXReader().read(new File("./src/contact.xml"));

        String xpath = "";

        /**
         * 1.      /      绝对路径      表示从xml的根位置开始或子元素(一个层次结构)
         */
        xpath = "/contactList";
        xpath = "/contactList/contact";

        /**
         * 2. //     相对路径       表示不分任何层次结构的选择元素。
         */
        xpath = "//contact/name";
        xpath = "//name";

        /**
         * 3. *      通配符         表示匹配所有元素
         */
        xpath = "/contactList/*"; //根标签contactList下的所有子标签
        xpath = "/contactList//*";//根标签contactList下的所有标签(不分层次结构)

        /**
         * 4. []      条件           表示选择什么条件下的元素
         */
        //带有id属性的contact标签
        xpath = "//contact[@id]";
        //第二个的contact标签
        xpath = "//contact[2]";
        //选择最后一个contact标签
        xpath = "//contact[last()]";

        /**
         * 5. @     属性            表示选择属性节点
         */
        xpath = "//@id"; //选择id属性节点对象,返回的是Attribute对象
        xpath = "//contact[not(@id)]";//选择不包含id属性的contact标签节点
        xpath = "//contact[@id='002']";//选择id属性值为002的contact标签
        xpath = "//contact[@id='001' and @name='eric']";//选择id属性值为001,且name属性为eric的contact标签

        /**
         *6.  text()   表示选择文本内容
         */
        //选择name标签下的文本内容,返回Text对象
        xpath = "//name/text()";
        xpath = "//contact/name[text()='张三']";//选择姓名为张三的name标签


        List<Node> list = doc.selectNodes(xpath);
        for (Node node : list) {
            System.out.println(node);
        }
    }


}

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

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
//xpath案例: 模拟用户登录效果
public class Demo1 {
    //xPath表达式语法
    public static void main(String[] args) throws DocumentException, IOException {
        //1.获取用户输入的用户名和密码
        BufferedReader br =
                new BufferedReader(new InputStreamReader(System.in));

        System.out.println("请输入用户名:");
        String name = br.readLine();

        System.out.println("请输入密码:");
        String password = br.readLine();

        //2.到“数据库”中查询是否有对应的用户
        //对应的用户:  在user.xml文件中找到一个
        //name属性值为‘用户输入’,且password属性值为‘用户输入’的user标签
        Document doc = new SAXReader().read(new File("./src/user.xml"));
        Element userElem = (Element)doc.selectSingleNode("//user[@name='" +name +"' and @password='"+password+"']");

        if(userElem!=null){
            //登录成功
            System.out.println("登录成功");
        }else{
            //登录失败
            System.out.println("登录失败");
        }

    }


}

user.xml

<?xml version="1.0" encoding="utf-8"?>
<users>
    <user id="001" name="eric" password="123456"></user>
    <user id="002" name="rose" password="123456"></user>
    <user id="003" name="jack" password="123456"></user>
</users>

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

import java.io.File;
import java.io.IOException;
import java.util.List;

// 使用xpath技术读取一个规范的html文档
public class Demo1 {
    //xPath表达式语法
    public static void main(String[] args) throws DocumentException, IOException {
        Document doc = new SAXReader().read(new File("./src/personList.html"));
        //System.out.println(doc);

        //读取title标签
        Element titleElem = (Element)doc.selectSingleNode("//title");
        String title = titleElem.getText();
        System.out.println(title);

        /**
         * 练习:读取联系人的所有信息
         * 按照以下格式输出:
         *          编号:001 姓名:张三 性别:男 年龄:18 地址:xxxx 电话: xxxx
         *       编号:002 姓名:李四 性别:女 年龄:20 地址:xxxx 电话: xxxx
         *       ......
         */
        //1.读取出所有tbody中的tr标签
        List<Element> list = (List<Element>)doc.selectNodes("//tbody/tr");
        //2.遍历
        for (Element elem : list) {
            //编号
            //String id = ((Element)elem.elements().get(0)).getText();
            String id = elem.selectSingleNode("td[1]").getText();
            //姓名
            String name = ((Element)elem.elements().get(1)).getText();
            //性别
            String gender = ((Element)elem.elements().get(2)).getText();
            //年龄
            String age = ((Element)elem.elements().get(3)).getText();
            //地址
            String address = ((Element)elem.elements().get(4)).getText();
            //电话
            String phone = ((Element)elem.elements().get(5)).getText();

            System.out.println("编号:"+id+"	姓名:"+name+"	性别:"+
                    gender+"	年龄:"+
                    age+"	地址:"+address+
                    "	电话:"+phone);
        }
    }


}

personlist.xml

<html>
    <head>
        <title>通讯录</title>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
    </head>
    <body>
        <center><h1>我的通讯录</h1></center>
        <table border="1" align="center" id="contactForm">
            <thead>    
                <tr><th>编号</th><th>姓名</th><th>性别</th><th>年龄</th><th>地址</th><th>电话</th></tr>
            </thead>
            <tbody>
                <tr>
                <td>001</td>
                <td>张三</td>
                <td>男</td>
                <td>18</td>
                <td>广州市天河区</td>
                <td>134000000000</td>
                </tr>
                <tr>
                <td>002</td>
                <td>李四</td>
                <td>女</td>
                <td>20</td>
                <td>广州市越秀区</td>
                <td>13888888888</td>
                </tr>
                <tr>
                <td>002</td>
                <td>郭靖</td>
                <td>男</td>
                <td>30</td>
                <td>广州市番禺区</td>
                <td>1342214321</td>
                </tr>
            </tbody>
        </table>
    </body>
</html>

运行,日志如下:

通讯录
编号:001    姓名:张三    性别:男    年龄:18    地址:广州市天河区    电话:134000000000
编号:002    姓名:李四    性别:女    年龄:20    地址:广州市越秀区    电话:13888888888
编号:002    姓名:郭靖    性别:男    年龄:30    地址:广州市番禺区    电话:1342214321

                 

原文地址:https://www.cnblogs.com/loaderman/p/9996229.html