XML文件解析--xpath技术<一>
来源:互联网 发布:在淘宝上怎么搜索发票 编辑:程序博客网 时间:2024/06/10 08:05
最近用到xml文件解析,刚开始竟然忘了xpath,一股脑不断的用各种for,for,for循环遍历,还在想break来减少循环…,写得差不多的时候觉得很不对劲,终于想到xpath(我不是菜鸟,我是小菜鸟…)。先了解下皮毛吧,记录一下。
一、Element(元素)和节点(Node)
节点:
- element 元素(常用)
- attribute 属性(常用)
- text 文本(常用)
- namespace 命名空间
- processing-instruction 处理指令
- comment 注释
- root 根节点(文档节点)
可以这么理解,一个Element(元素)一定是节点(Node),但一个节点不一定是Element(元素)。
XML
<?xml version="1.0" encoding="UTF-8"?> <School> <class id="1"> <classNo>C_1</classNo> <className>class 1</className> <students> <student> <sno>C_1_1</sno> <sname>Jack</sname> <age>13</age> </student> <student> <sno>C_1_2</sno> <sname>Tom</sname> <age>12</age> </student> </students> </class> <class id="2"> <classNo>C_2</classNo> <className>class 2</className> <students> <student> <sno>C_2_1</sno> <sname>Jim</sname> <age>13</age> </student> </students> </class> <class > <classNo>C_3</classNo> <className>class 3</className> <students> <student> <sno>C_3_1</sno> <sname>Jim</sname> <age>13</age> </student> </students> </class> </School>
二、选择节点的规则
nodeName: 表示选择该节点下名称为nodeName的子节点
“/”: 表示选择根节点
“/”: 同时也用作路径分隔符
“//”: 表示选择任意位置的符合条件的节点。不管它们在文档中的位置
“.” : 表示当前节点,
“..” 表示当前结点的父节点
“@” : 选择属性
package com.peter.test;import java.io.File;import java.util.List;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Node;import org.dom4j.io.SAXReader;import org.junit.Test;public class Test1 { private static String path = "D:/CSDN/test/xmlTest.xml"; private static Document document = null; static { SAXReader sr = new SAXReader(); try { document = sr.read(new File(path)); } catch (DocumentException e) { e.printStackTrace(); } } @Test public void getNodes() { // 获取根节点 Node rootNode = document.selectSingleNode("/"); System.out.println(rootNode.getName()); // file:///D:/CSDN/test/xmlTest.xml Node rootNode1 = document.selectSingleNode("School"); // School是document的子节点 System.out.println(rootNode1.getName()); // School Node rootNode2 = document.selectSingleNode("/School"); System.out.println(rootNode2.getName()); // School List<Node> classNode = rootNode2.selectNodes("class"); // class是School的子节点 System.out.println(classNode.size()); // 2 System.out.println(classNode.get(0).getName() + "---" + classNode.get(1).getName()); // class---class //无视节点在文档的路径 “//” 只要符合条件,无视在文档的位置,全部抓取到 List students = document.selectNodes("//student"); System.out.println(students.size()); //3 (xml文档中有3个student节点) //相对路径 "."表示当前的节点 Node shelfNode = classNode.get(0).selectSingleNode("."); Node NoNode = classNode.get(0).selectSingleNode("./classNo"); System.out.println(shelfNode.getName()); //class System.out.println(NoNode.getName()+"---"+NoNode.getText()); //classNo---C_1 //父节点 Node pNode = classNode.get(0).selectSingleNode(".."); System.out.println(pNode.getName()); //School //属性 获取所有名为id的属性 Node attriNode = document.selectSingleNode("//@id"); // System.out.println(attriNode.getName()+"--"+attriNode.getText()); //id--1 }}
三、谓语(带条件过滤)
用来查找某个特定的节点或者包含某个指定的值的节点。
[] : 谓语写在中括号中。
@Test public void getNodes() { // 获取根节点 Node rootNode = document.selectSingleNode("/"); System.out.println(rootNode.getName()); // file:///D:/CSDN/test/xmlTest.xml Node rootNode1 = document.selectSingleNode("School"); // School是document的子节点 System.out.println(rootNode1.getName()); // School //谓语 (过滤条件) /** * "//student[sno='C_1_1']" * //student:把所有的student节点抓取到 * [sno='C_1_1']:在抓取到的节点中筛选 出 sno="C_1_1"的节点 */ //获取班号为C_1_1的班级 List<Node> studentNodes = document.selectNodes("//student[sno='C_1_1']"); System.out.println(studentNodes.size()); //1 System.out.println(studentNodes.get(0).selectSingleNode("./sname").getText()); //Jack //获取id为2的班级 List<Node> classNodes = document.selectNodes("//class[@id='2']"); System.out.println(classNodes.size());//1 System.out.println(classNodes.get(0).selectSingleNode("./className").getText());//class 2 //获取拥有属性名为id的班级 List<Node> classNodes2 = document.selectNodes("//class[@id]"); System.out.println(classNodes2.size());//2 System.out.println(classNodes2.get(0).selectSingleNode("./className").getText());//class 1 System.out.println(classNodes2.get(1).selectSingleNode("./className").getText());//class 2 }
四、通配符
“*” : 匹配任何元素节点
“@*” : 匹配任何属性节点
Node() 匹配任何类型的节点
@Test public void getNodes() { // 获取根节点 Node rootNode = document.selectSingleNode("/"); System.out.println(rootNode.getName()); // file:///D:/CSDN/test/xmlTest.xml Node rootNode1 = document.selectSingleNode("School"); // School是document的子节点 System.out.println(rootNode1.getName()); // School // "*" 通配符表示任何的元素节点 List<Node> studentInfoElems = document.selectNodes("//student/*"); System.out.println(studentInfoElems.size()); //12 // “@*” : 匹配任何属性节点 List<Node> attriElems = document.selectNodes("//@*"); System.out.println(attriElems.size()); //2 System.out.println(attriElems.get(0).getName()+"---"+attriElems.get(0).getText());//id---1 System.out.println(attriElems.get(1).getName()+"---"+attriElems.get(1).getText());//id---2 }
待续…
五、选取若干路径
使用”|”运算符,可以选取若干个路径。
//book/title | //book/price 选取 book 元素的所有 title 和 price 元素。
六、相对路径和绝对路径
绝对路径必须要以”/”开头
相对路径可以 以”./”开头,也可以直接以元素名称开头。
- XML文件解析--xpath技术<一>
- C# xpath解析XML文件
- 使用XPath解析XML文件
- 用XPath解析XML文件
- XML文件解析技术:SAX解析(一)
- Javascript—XPATH技术解析XML
- Javascript—XPATH技术解析XML
- Dom4j和XPath的XML解析技术
- XML文件解析技术总结(一)
- 用XPath解析XML文档(一)
- dom4j(xpath)解析xml一例
- libxml中使用xpath解析xml文件
- Dom4j解析XML文件(Xpath)
- 深入XPath对xml文件的解析
- 采用Dom4j及xpath解析xml文件
- C#通过XPath解析xml文件
- xpath解析xmlns字段的xml文件
- XML解析技术一
- Dynamic 2D Imposters: A Simple, Efficient DirectX 9 Implementation
- WPS常见问题01——如何禁止自动生成序号如1. 2. 3. 4.
- Java基础--数组和链表的区别
- 30OS笔记(1)
- RecyclerView 的使用详解(一)
- XML文件解析--xpath技术<一>
- Android自动化之uiautomator(一)
- 01字典树模板
- 推荐!手把手教你使用Git
- 渐变圆形及矩形
- MyBatis学习总结(三)——优化MyBatis配置文件中的配置
- java基础--Set、List和Map的区别
- genymotion的安装和使用
- 【杭电oj2024】C语言合法标识符