2011-08-24 52 views
0

我有以下XML文件:的XPath - 从父元素获取id属性

<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 

如何做,在我的描述也返回XML:ID 控制元素?我需要知道给定元素的描述控制

回答

0

有人纠正我,如果我错了,但我不认为这是可以用一个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 

然后可以通过该列表解析和构建你的结果。

要小心。这如果有1%的control元素最多settings元素才有效。此外,您可能会发现在评估时XPath引擎会为该xml:前缀引发错误。可能会说这是未知的。您可能必须先将该前缀绑定到正确的名称空间。由于xml前缀是默认保留并绑定到特定命名空间的,因此可能不需要。我不确定,因为我以前没有用过它。

我测试过在XMLSpy的表达。 Java中使用的XPath引擎(或者您设置的引擎)以其他顺序返回节点并非完全不可能。它可以分别评估“或”(管道符号)的两部分,然后将结果转储到单个节点列表中。我不知道XPath规范关于结果排序的要求是什么。

0

我可能同样错了,但在结果中遍历的节点是XML节点本身。您的代码示例几乎存在于:
- nodes.item(i)指向属性“description”。
- nodes.item(i).getParentNode()指向标记“设置”。
- nodes.item(i).getParentNode()。getParentNode()将指向标记“control”(class Element)。然后,您可以在该节点上使用getAttribute()或getAttributeNS()来查找所需的属性。

+0

这也想到了我,但问题是getParentNode()返回null。 – Martin

+0

也许元素不被认为是属性的父节点?他可以获取设置元素并手动获取描述属性。 –