# XPath技術
### 基本概述
????XPath即為XML路徑語言,它是一種用來確定XML(標準通用標記語言的子集)文檔中某部分位置的語言。XPath基于XML的樹狀結構,提供在數據結構樹中找尋節點的能力。起初?XPath?的提出的初衷是將其作為一個通用的、介于XPointer與XSLT間的語法模型。但是?XPath?很快的被開發者采用來當作小型查詢語言。
PS:其配合DOM4J解析技術,彌補了DOM4J不能跨層取元素的缺點。需要引入jaxen-1.1-beta-6.jar包。
?
### XPath原理
????XPath就好比SQL查詢語句,能夠對DOM樹進行查詢操作,并獲取相應結果。
?
### XPath案例
**XML9.xml**
~~~
<?xml version="1.0" encoding="utf-8"?>
<AAA>
<BBB id="b1">Hello World B1</BBB>
<CCC id="c1"/>
<BBB id="b2">Hello World B2</BBB>
<BBB>Hello World B3</BBB>
<DDD>
<BBB id="b3">Hello World B4</BBB>
</DDD>
<CCC>
<DDD>
<BBB id="b4"/>
<BBB id="b5"/>
</DDD>
</CCC>
</AAA>
~~~
~~~
package com.pc;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
/**
*
* @author Switch
* @function DOM4j配合xpath
*
*/
public class XML9 {
public static void main(String[] args) throws Exception {
// 1.得到SAXReader解析器
SAXReader saxReader = new SAXReader();
// 2.指定解析哪個文件
Document document = saxReader.read("src/com/pc/XML9.xml");
// 3.使用XPath隨意讀取任何一層的元素
// document.selectNodes(); //返回多個元素
// document.selectSingleNode(); // 返回一個元素
// 取出AAA下面的所有BBB 3個
// List nodeList = document.selectNodes("/AAA/BBB");
// 取出所有的BBB 6個
// List nodeList = document.selectNodes("//BBB");
// System.out.println(nodeList.size());
// 取出AAA下面的DDD下面的最后一個BBB元素的內容 Hello World B4
// List nodeList = document.selectNodes("/AAA/DDD//BBB[last()]");
// System.out.println(((Element)nodeList.get(0)).getTextTrim());
// 取出AAA下面的CCC下面的DDD下面的所有元素 2個
// List nodeList = document.selectNodes("/AAA/CCC/DDD/*");
// 取出所有有三個祖先元素的BBB元素
// List nodeList = document.selectNodes("/*/*/*/BBB");
// System.out.println(nodeList.size());
// 取出AAA下面的第一個BBB元素的內容 Hello World B1
// List nodeList = document.selectNodes("/AAA/BBB[1]");
// System.out.println(((Element)nodeList.get(0)).getTextTrim());
// Element element = (Element) document.selectSingleNode("/AAA/BBB[1]");
// System.out.println(element.getTextTrim());
// 取出所有有id屬性的元素的id屬性 5個
// List nodeList = document.selectNodes("//@id");
// System.out.println(nodeList.size());
// 取出第一個有id屬性的元素的id屬性的值 b1
// System.out.println(((Attribute)nodeList.get(0)).getText());
// 取出所有有id屬性的CCC元素
// List nodeList = document.selectNodes("//CCC[@id]");
// System.out.println(nodeList.size());
// "//BBB[@*]" 選擇有任意屬性的BBB元素
// "//BBB[not(@*)]" 選擇沒有屬性的BBB元素
// "//BBB[@id='b1']" 選擇含有屬性id且其值為'b1'的BBB元素
// 選擇含有屬性id且其值(在用normalize-space函數去掉前后空格后)為'b2'的BBB元素
// "//BBB[normalize-space(@id)='b2']"
// "//*[count(BBB)=2]" 選擇含有2個BBB子元素的元素
// "//*[name()='BBB']" 選擇所有名稱為BBB的元素(這里等價于//BBB)
// "//*[starts-with(name(),'B')]" 選擇所有名稱以"B"起始的元素
// "//*[contains(name(),'C')]" 選擇所有名稱包含"C"的元素
// "//*[string-length(name()) = 3]" 選擇名字長度為3的元素
// "//*[string-length(name()) < 4]" 選擇名字長度小于3的元素
// 同樣的將<替換成大于號則是大于
// 11個
// List nodeList = document.selectNodes("//*[string-length(name()) < 4]");
// System.out.println(nodeList.size());
// "//CCC | //BBB" 選擇所有的CCC和BBB元素
}
}
~~~
PS:通過上述案例中的XPath語句,基本的XML查詢,使用是沒問題的。