簡體   English   中英

XPath-從父元素獲取ID屬性

[英]XPath - Get id attribute from parent element

我有以下xml文件:

<diagnostic version="1.0">
  <!-- diagnostic panel 1 -->
  <panel xml:id="0">
    <!-- list controls -->
    <control xml:id="0_0">
      <settings description="text 1"/>
    </control>
    <control xml:id="0_1">
      <settings description="text 2"/>
    </control>
  </panel>
  <panel xml:id="1">
    <!-- list controls -->
    <control xml:id="1_0">
      <settings description="text 3"/>
    </control>
    <control xml:id="1_1">
      <settings description="text 4"/>
    </control>
  </panel>
</diagnostic>

和定義XPath:

//*[not(@description='-')]/@description

和Java代碼:

DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); 
domFactory.setNamespaceAware(true);  
DocumentBuilder builder = domFactory.newDocumentBuilder(); 
Document doc = builder.parse("diagnostic.xml"); 
XPath xpath = XPathFactory.newInstance().newXPath(); 
// XPath Query for showing all nodes value 
XPathExpression expr = xpath.compile("//*[not(@description='-')]/@description"); 

Object result = expr.evaluate(doc, XPathConstants.NODESET); 
NodeList nodes = (NodeList) result; 
for (int i = 0; i < nodes.getLength(); i++) { 
  System.out.println(i + ": " + nodes.item(i).getParentNode()  + nodes.item(i).getNodeValue());  
} 

XPath的此定義將返回所有屬性值說明 ,其中此屬性的值不是'-'。

輸出:

text 1
text 2
text 3
text 4

但是我需要找到此屬性描述以及xml:id元素控件

輸出:

0_0 text 1
0_1 text 2
1_0 text 3
1_1 text 4

在我的說明中該如何執行,還返回controlxml:id元素? 我需要知道給定元素的描述是control

如果我錯了,請有人糾正我,但是我不認為可以使用單個XPath表達式來完成。 concat函數返回單個文本結果,而不是列表。 我建議您運行多個XPath表達式並從中構造結果,或者運行單個XPath表達式以獲取所需的settings元素,然后從中獲取description屬性,並將其與父元素中的xml:id屬性連接起來(如果這樣)一個control 節點保留對其父代的引用。 使用方法getParentNode()來獲取它。

這是一種替代方法:運行此XPath表達式...

//control[settings[@description!='-']]/@xml:id | //control/settings[@description!='-']/@description

...,然后將交替結果的文本連接到返回的節點列表中。 換句話說,項目0 +項目1的文本,項目2 +項目3的文本,依此類推。

上面的XPath表達式將返回此節點列表:

0_0
text 1
0_1
text 2
1_0
text 3
1_1
text 4

然后,您可以解析該列表並構建結果。

小心。 僅當每個control元素最多包含1個settings元素時,此方法才有效。 另外,您可能會發現,在評估中,XPath引擎對該xml:前綴拋出錯誤。 可能會說這是未知的。 您可能必須先將該前綴綁定到正確的名稱空間。 由於xml前綴是保留的,並且默認情況下綁定到特定的名稱空間,因此可能不需要。 我不確定,因為我以前沒有用過。

我已經在XMLSpy中測試了該表達式。 Java中使用的XPath引擎(或您設​​置為使用的引擎)並非完全不可能以另一順序返回節點。 它可能會分別評估“或”(管道符號)的兩個部分,然后將結果轉儲到單個節點列表中。 我不知道XPath規范對結果排序有什么要求。

我可能也是錯的,但是結果中遍歷的節點是XML節點本身。 您的代碼示例幾乎在那里:
-nodes.item(i)指向屬性“描述”。
-nodes.item(i).getParentNode()指向標記“設置”。
-nodes.item(i).getParentNode()。getParentNode()指向標記“控件”(類Element)。 然后,您可以在該節點上使用getAttribute()或getAttributeNS()來查找所需的屬性。

暫無
暫無

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

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