zoukankan      html  css  js  c++  java
  • 在Java中使用xpath对xml解析

     个人博客地址:http://www.ijianmi.com/

    xpath是一门在xml文档中查找信息的语言。xpath用于在XML文档中通过元素和属性进行导航。它的返回值可能是节点,节点集合,文本,以及节点和文本的混合等。
    在学习本文档之前应该对XML的节点,元素,属性,文本,处理指令,注释,根节点,命名空间以及节点关系有一定的了解以及对xpath也有了解。
    XML学习地址:http://www.runoob.com/xml/xml-tutorial.html
    xpath基本语法学习地址:http://www.runoob.com/xpath/xpath-tutorial.html
    xpath官方文档:https://yunpan.cn/cvc4tEIGy5EvS 访问密码 9d16
    本文主要介绍:Java中使用xpath操作对xml操作。
    1)首先在dom4j中如何使用xpath技术
    导入xPath支持的jar包。jaxen-1.1-beta-6.jar(首先要先导入dom4j包,dom4j下载地址:http://www.dom4j.org/dom4j-1.6.1/)。

    导包之后如图所示:

    如果不知道怎样导包请参考我以前的一篇博客:Java获取xml节点总结之读取xml文档节点
    2)在Java中使用xpath方法,主要有两点:
    List<Node> selectNodes("xpath表达式"); 查询多个节点对象
    Node selectSingleNode("xpath表达式"); 查询一个节点对象
    下面就用实例说明使用方法。

    一、selectNodes使用方法:

     1 package com.vastsum.demo;
     2 
     3 import java.io.File;
     4 import java.io.FileOutputStream;
     5 import java.util.List;
     6 
     7 import org.dom4j.Document;
     8 import org.dom4j.Element;
     9 import org.dom4j.Node;
    10 import org.dom4j.io.OutputFormat;
    11 import org.dom4j.io.SAXReader;
    12 import org.dom4j.io.XMLWriter;
    13 
    14 /**
    15  * 
    16  * @author shutu008
    17  *selectNode的使用方法
    18  */
    19 public class xpathDemo {
    20 
    21     public static void main(String[] args) throws Exception {
    22 
    23     Document doc = new SAXReader().read(new File("./src/contact.xml"));
    24         
    25         /**
    26          * @param xpath 表示xpath语法变量
    27          */
    28     String xpath="";
    29         
    30         /**
    31          * 1.      /      绝对路径      表示从xml的根位置开始或子元素(一个层次结构)
    32          */
    33         xpath = "/contactList";
    34         xpath = "/contactList/contact";
    35         
    36         /**
    37          * 2. //     相对路径       表示不分任何层次结构的选择元素。
    38          */
    39         xpath = "//contact/name";
    40         xpath = "//name";
    41         
    42         /**
    43          * 3. *      通配符         表示匹配所有元素
    44          */
    45         xpath = "/contactList/*"; //根标签contactList下的所有子标签
    46         xpath = "/contactList//*";//根标签contactList下的所有标签(不分层次结构)
    47         
    48         /**
    49          * 4. []      条件           表示选择什么条件下的元素
    50          */
    51         //带有id属性的contact标签
    52         xpath = "//contact[@id]";
    53         //第二个的contact标签
    54         xpath = "//contact[2]";
    55         //选择最后一个contact标签
    56         xpath = "//contact[last()]";
    57         
    58         /**
    59          * 5. @     属性            表示选择属性节点
    60          */
    61         xpath = "//@id"; //选择id属性节点对象,返回的是Attribute对象
    62         xpath = "//contact[not(@id)]";//选择不包含id属性的contact标签节点
    63         xpath = "//contact[@id='002']";//选择id属性值为002的contact标签
    64         xpath = "//contact[@id='001' and @name='eric']";//选择id属性值为001,且name属性为eric的contact标签
    65         
    66         /**
    67          *6.  text()   表示选择文本内容
    68          */
    69         //选择name标签下的文本内容,返回Text对象
    70         xpath = "//name/text()";
    71         xpath = "//contact/name[text()='张三']";//选择姓名为张三的name标签
    72         
    73         
    74         List<Node> list = doc.selectNodes(xpath);
    75         for (Node node : list) {
    76             System.out.println(node);
    77         }
    78     
    79         //写出xml文件
    80         //输出位置
    81         FileOutputStream out = new FileOutputStream("d:/contact.xml");
    82         
    83         //指定格式
    84         OutputFormat format = OutputFormat.createPrettyPrint();
    85         format.setEncoding("utf-8");
    86         XMLWriter writer = new XMLWriter(out,format);
    87         
    88         //写出内容
    89         writer.write(doc);
    90         
    91         //关闭资源
    92         writer.close();
    93         
    94     }
    95     
    96 
    97 }

    二、selectSingleNode的使用方法

     1 package com.vastsum.demo;
     2 
     3 import java.io.File;
     4 import java.util.Iterator;
     5 
     6 import org.dom4j.Attribute;
     7 import org.dom4j.Document;
     8 import org.dom4j.Element;
     9 import org.dom4j.io.SAXReader;
    10 
    11 /**
    12  * 
    13  * @author shutu008
    14  *selectSingleNode的使用
    15  */
    16  public class xpathDemo1{
    17      public static void main(String[] args) throws Exception{
    18          //读取XML文件,获得document对象
    19         SAXReader saxReader = new SAXReader();    
    20         Document doc = saxReader.read(new File("./src/contact.xml"));
    21         
    22         //使用xpath获取某个节点
    23         String xpath = "";
    24         
    25         //对contact元素 id="001"的节点,操作
    26         xpath = "//contact[@id = '001']";
    27         Element contactElem =    (Element)doc.selectSingleNode(xpath);
    28         
    29         //设置这个节点的属性值
    30         contactElem.addAttribute("name", "001");
    31         
    32         //输出这个节点的所有属性值
    33         for(Iterator it = contactElem.attributeIterator();it.hasNext();){
    34         Attribute conAttr = (Attribute)it.next();
    35         String conTxt = conAttr.getValue();
    36         String conAttrName = conAttr.getName();
    37         System.out.println(conAttrName+" = "+conTxt);
    38         }
    39         
    40      }
    41  }

     备注:以下是操作的xml文件

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <contactList id="0">
     3     <contact id="001" class="style" name="lisi">
     4         <name>张三</name>
     5         <age>20</age>
     6         <phone>134222223333</phone>
     7         <email>zhangsan@qq.com</email>
     8         <qq>432221111</qq>
     9     </contact>
    10     <contact id="002">
    11         <name>李四</name>
    12         <age>20</age>
    13         <phone>134222225555</phone>
    14         <email>lisi@qq.com</email>
    15         <qq>432222222</qq>
    16     </contact>
    17     <contactTwo>
    18         <name>王五</name>
    19         <age>32</age>
    20         <phone>465431341</phone>
    21         <emali>af@qq.com</emali>
    22         <qq>46164694</qq>
    23     </contactTwo>
    24     <test>测试</test>
    25     <test>其他用途</test>
    26 </contactList>
    View Code
  • 相关阅读:
    C语言面向对象编程(五):单链表实现(转)
    pthread_barrier_init,pthread_barrier_wait简介(转)
    Linux信号(signal) 机制分析(转)
    Linux 进程间通信 --- 信号通信 --- signal --- signal(SIGINT, my_func); --- 按键驱动异步通知(转)
    Linux 多线程环境下 进程线程终止函数小结(转)
    批量杀进程 ps awk grep
    C++中的INL(转)
    gdb调试多进程和多线程命令(转)
    转: 基于netty+ protobuf +spring + hibernate + jgroups开发的游戏服务端
    转:全栈工程师的知识栈列表
  • 原文地址:https://www.cnblogs.com/vastsum/p/5940235.html
Copyright © 2011-2022 走看看