• 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

                     

  • 相关阅读:
    【http】HTTP请求方法 之 OPTIONS
    【javascript基础】函数前面的一元操作符
    【javascript基础】运算符优先级
    【移动互联网开发】Zepto 使用中的一些注意点 【转】
    【jQuery】IE9 jQuery 1.9.1 报 Syntax error,unrecognized expression 错误
    一月收集几个有用的谷歌Chrome插件
    【Sizzle学习】之关于【初探 jQuery 的 Sizzle 选择器】这篇文章里的小bug
    【第三方类库】underscore.js源码---each forEach 每次迭代跟{}比较的疑惑
    vue-cli脚手架npm相关文件解读(2)webpack.prod.conf.js
    vue-cli脚手架npm相关文件解读(1)webpack.base.conf.js
  • 原文地址:https://www.cnblogs.com/loaderman/p/9996229.html
Copyright © 2020-2023  润新知