![](/img/trans.png)
[英]Get attribute value based on condition from other attribute in xpath element
[英]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
在我的說明中該如何執行,還返回control的xml: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.