更新時間:2020-12-09 17:22:01 來源:動力節點 瀏覽1635次
XPath,全稱 XML Path Language,即 XML 路徑語言,它是一門在XML文檔中查找信息的語言。XPath最初設計是用來搜尋XML文檔的,這是因為XML表述了一種樹狀結構,而XPath作為一種小型的查詢語言能夠根據XML結構樹在樹中尋找節點。因此,XPATH解析XML文件也是手到擒來。
XPath 的選擇功能十分強大,它提供了非常簡潔明了的路徑選擇表達式,另外它還提供了超過 100 個內建函數用于字符串、數值、時間的匹配以及節點、序列的處理等等,幾乎所有我們想要定位的節點都可以用XPath來選擇。XPath 于 1999 年 11 月 16 日 成為 W3C 標準,它被設計為供 XSLT、XPointer 以及其他 XML 解析軟件使用,XPath定義了一組語法,能夠從結構樹中篩選出滿足要求的節點。
我們現用一個實例來感受一下使用 XPath解析 XML文件解析的過程,代碼如下:
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
public class TestXPath {
public static void main(String[] args) throws DocumentException {
//1 創建SAXReader對象
SAXReader reader = new SAXReader();
//2 讀XML文件
Document doc = reader.read("web/book.xml");
//得到第一個author節點
Node node = doc.selectSingleNode("//author");
System.out.println("節點的名稱:" + node.getName() + "\t" + node.getText());
//得到所有author節點
List<Node> nodeList = doc.selectNodes("//author");
for (Iterator<Node> iBook = nodeList.iterator();iBook.hasNext();) {
Node n = iBook.next();
System.out.println("節點的名稱:" + n.getName() + "\t" + n.getText());
}
List<Node> nameList = doc.selectNodes("//name");
for (Iterator<Node> iBook = nameList.iterator();iBook.hasNext();) {
Node n = iBook.next();
System.out.println("節點的名稱:" + n.getName() + "\t" + n.getText());
}
}
}
在這里我們首先導入了 LXML 庫的 etree 模塊,然后聲明了一段 XML文本,調用 XML 類進行初始化,這樣我們就成功構造了一個 XPath 解析對象,在這里注意到XML文本中的最后一個 li 節點是沒有閉合的,但是 etree 模塊可以對XML文本進行自動修正。
我們一般會用 // 開頭的 XPath 規則來選取所有符合要求的節點,以上文的XML文本為例,如果我們要選取所有節點,可以這樣實現:from lxml import etree
xml= etree.parse('./testxml', etree.XMLParser())
result =xml.xpath('//*')
print(result)
運行結果:
[<Element xml at 0x10510d9c8>, <Element body at 0x10510da08>, <Element div at 0x10510da48>, <Element ul at 0x10510da88>, <Element li at 0x10510dac8>, <Element a at 0x10510db48>, <Element li at 0x10510db88>, <Element a at 0x10510dbc8>, <Element li at 0x10510dc08>, <Element a at 0x10510db08>, <Element li at 0x10510dc48>, <Element a at 0x10510dc88>, <Element li at 0x10510dcc8>, <Element a at 0x10510dd08>]
我們在這里使用 * 代表匹配所有節點,也就是整個XML文本中的所有節點都會被獲取,可以看到返回形式是一個列表,每個元素是 Element 類型,其后跟了節點的名稱,如 xml、body、div、ul、li、a 等等,所有的節點都包含在列表中了。當然此處匹配也可以指定節點名稱,如果我們想獲取所有 li 節點,示例如下:
from lxml import etree
html = etree.parse('./test.html', etree.XMLParser())
result = xml.xpath('//li')
print(result)
print(result[0])
在這里我們要選取所有 li 節點可以使用 //,然后直接加上節點的名稱即可,調用時直接調用 xpath() 方法即可提取。運行結果:[<Element li at 0x105849208>, <Element li at 0x105849248>, <Element li at 0x105849288>, <Element li at 0x1058492c8>, <Element li at 0x105849308>]
<Element li at 0x105849208>
在這里我們可以看到提取結果是一個列表形式,其每一個元素都是一個 Element 對象,如果要取出其中一個對象可以直接用中括號加索引即可取出,如 [0]。
javax.xml.xpath包提供了強大的XPath解析功能,因此我們可以基于它實現XML的解析。XPathParser類中封裝了“javax.xml.xpath.XPath”類的對象。我們已經知道XPath對象是XML解析的利器,因此XPathParser類便具有了XML解析的能力。
下面代碼給出了XPathParser類的帶注釋的屬性。// 代表要解析的整個XML文檔
private final Document document;
// 是否開啟驗證
private boolean validation;
// EntityResolver,通過它可以聲明尋找DTD文件的方法,例如通過本地尋找,而不是只能通過網絡下載DTD文件
private EntityResolver entityResolver;
// MyBatis配置文件中的properties節點的信息
private Properties variables;
// javax.xml.xpath.XPath工具
private XPath xpath;
有必要說明一下,上述“private Properties variables”屬性存儲的內容就是MyBatis配置文件中properties節點的信息。properties節點會在解析配置文件的最開始就被解析,然后相關信息會被放入“private Properties variables”屬性并在解析后續節點時發揮作用。
實際上,你不要以為XPath解析XML文件是專屬,相反同樣適用于解析HTML文件,而且XPath在做爬蟲時對信息的抽取能力也是十分出眾的。想深入學習XPath的小伙伴,可以在本站的XML教程中找到XPath的更多知識。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習