在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>