簡體   English   中英

xpath 在 java 中提取所有 xml 元素

[英]xpath in java to extract all the xml elements

任何人都可以提供一個示例,使用 java 中的 xpath 從 xml 文件中提取所有元素及其屬性和值嗎?

謝謝

幾年前我為我的團隊寫了這篇文章。 會有幫助的。

什么是 xPath?

  1. XPath 是一種用於在 XML 文檔中查找信息的語言。
  2. XPath 是用於定義 XML 文檔部分的語法。
  3. XPath 使用路徑表達式在 XML 文檔中導航。
  4. XPath 包含一個標准函數庫。
  5. XPath 是 XSLT 中的主要元素。
  6. XPath 是 W3C 推薦標准。

XPath中有七種節點:元素節點、屬性節點、文本節點、名稱空間節點、處理指令節點、注釋節點和文檔(根)節點。 XML 文檔被視為節點樹。 樹的根稱為文檔節點(或根節點)。

考慮以下 Xml 文檔。

<information>
    <person id="1">
        <name>Tito George</name>
        <age>25</age>
        <gender>Male</gender>
        <dob>
             <date>25</date>
             <month>october</month>
             <year>1983</year>
        </dob>
    </person>


     <person id="2">
        <name>Kumar</name>
        <age>32</age>
        <gender>Male</gender>
        <dob>
             <date>28</date>
             <month>january</month>
             <year>1975</year>
        </dob>
    </person>


    <person id="3">
        <name>Deepali</name>
        <age>25</age>
        <gender>Female</gender>
        <dob>
             <date>17</date>
             <month>january</month>
             <year>1988</year>
        </dob>
    </person>

</information>

從文檔中獲取信息

DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
//Getting the instance of DocumentBuilderFactory 
domFactory.setNamespaceAware(true);
//true if the parser produced will provide support for XML namespaces; 
DocumentBuilder builder = domFactory.newDocumentBuilder();
//Creating document builder
Document doc = builder.parse("C:\\JavaTestFiles\\persons.xml");
XPath xpath = XPathFactory.newInstance().newXPath();
//getting instance of xPath
expr = xpath.compile("//@id");
result = expr.evaluate(doc, XPathConstants.NODESET);
NodeList nodes = (NodeList) result;
 for (int i = 0; i < nodes.getLength(); i++) {
     System.out.println(nodes.item(i).getNodeValue());
}

上面紅色的那一行是用於編譯 xPath 表達式的那一行, //@id 是實際的表達式。 表達式 //@id 將返回文檔中屬性 id 的值。 IE。 程序的輸出將是 1 2 和 3。在下表中,您可以找到可以在本文檔中使用的各種表達式。

上面代碼片段中的兩個重要語句是

  • expr = xpath.compile("//@id"); --> 這個編譯表達式。 如果不可編譯,此方法將拋出 XPathExpressionException。
  • expr.evaluate(doc, XPathConstants.NODESET); --> 在指定上下文中計算一個 XPath 表達式,並將結果作為指定類型返回。 在這個中,第二個參數定義了該方法將要返回的內容(returnType)。 如果 returnType 不是 XPathConstants(NUMBER、STRING、BOOLEAN、NODE 或 NODESET)中定義的類型之一,則會拋出 IllegalArgumentException。

基本上: XML 文檔是一個樹狀結構(分層)節點集合。 與分層目錄結構一樣,指定指向層次結構中特定節點的路徑很有用(因此規范的名稱:XPath)。

事實上,目錄路徑的大部分符號都原封不動地保留下來:

  • 正斜杠 (/) 用作路徑分隔符。
  • 文檔根目錄的絕對路徑以 / 開頭。
  • 從給定位置開始的相對路徑以其他任何內容開始。
  • 雙句點 (..) 表示當前節點的父節點。
  • 單個句點 (.) 表示當前節點。

信息

  • //@id --> 選擇所有名為 id 的屬性
  • //@* --> 選擇文檔中的所有屬性節點
  • //@id='1' --> 測試文檔中是否存在屬性 id = '1' 的節點。 如果存在,該語句將評估為真。 在這種情況下,XPathConstants.BOOLEAN 應該用作評估方法中的返回類型。
  • /information/person [age='24']name/text() 或
    //person[age='24'] name/text() --> 返回 'Kumar'.. 讓我們先拆分查詢:/information/person[age='24']/name/text() 第 1 部分:搜索具有元素“age”= 24 的節點“person”第 2 部分:獲取該節點的元素“name”第 3 部分:text()——是一個 xPath function,它將返回元素的文本節點'name' 注意:這里的信息是根節點,如果我們從根節點開始,一個斜杠就夠了,即是絕對路徑。 如果我們從子節點開始使用,則必須使用雙斜杠“//”,即它是一個相對路徑。
  • //person/dob[year>'1978'][year<1985]/../name/text() --> 這個表達式正在搜索 YOB 在 1978 和 1985 之間的人。檢查標記為紅色的文本. 這是因為元素 year 不是 person 的直接子節點,而是兄弟節點,換句話說,year 的直接父節點是節點。 所以我們需要 go 上一級來獲取元素“名稱”。
  • //person/dob[year>'1978'][year<1985]/../@id --> 這將返回滿足上述條件的節點的id。 注意:不需要調用 text() 方法來獲取屬性值
  • //person[age='25']//dob[date=25]/../name/text() --> 該表達式將返回年齡 = 25 且日期 = 25 的人的姓名。
  • /information/person[1] /name/text() 搜索第一人稱節點的名稱。
  • /information/person/ dob/child:: /text() --> 這樣會返回dob的所有子節點。 我們也可以這樣寫 child::information/child::person/child::dob/child:: /text()

以這種方式使用這個 XPath 表達式"//*"

Document doc = ... // the document on which apply XPath
XPathExpression xp = XPathFactory.newInstance().newXPath().compile("//*");
NodeList elements = (NodeList) xp.evaluate(doc, XPathConstants.NODESET);

它返回給您任何級別的所有元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM