以下XML代表了我正在使用的更复杂结构的简化版本。我希望能够根据一些元数据选择一个特定的值。
<Root>
<Data>
<KeyValuePair>
<Key>Field1</Key>
<Value>Value1</Value>
</KeyValuePair>
<KeyValuePair>
<Key>Field2</Key>
<Value>Value2</Value>
</KeyValuePair>
<KeyValuePair>
<Key>Field3</Key>
<Value>Value3</Value>
</KeyValuePair>
</Data>
<Name>Customer</Name>
<ID>00000000-0000-0000-0000-000000000000</ID>
</Root>
我希望能够选择Value节点的文本,其中Key节点文本等于“ Field2”,而Name节点等于“ Customer”。我还需要使它足够灵活,以至于不关心名称空间。
我已经可以使用以下方法从同级节点中选择节点:
//*[local-name()='Value'][../*[local-name()='Key'][./text() = 'Field2']]/text()
但是,尽管搜索产生了如何基于父属性选择子节点的结果,但我仍无法找到解决自己特殊难题的方法。
我是XPath的新手,所以我可能找不到正确的东西,或者可能没有针对我想要的解决方案。无论哪种方式,如果有人可以指出我正确的方向,将不胜感激。
编辑:为清楚起见,我对问题进行了重新表述:提供的XML并不是我正在使用的XML,而是结构的简化表示。我还看到了有关区分大小写的注释,并编辑了我的代码以更准确地反映给定的示例。
答案 0 :(得分:0)
此XPath,
/Root[Name="Customer"]/Data/KeyValuePair[Key="Field2"]/Value/text()
将选择Value
元素内的KeyValuePair
元素的所有文本节点以及其子元素为Key
的{{1}}子元素,前提是"Field2"
是KeyValuePair
元素的子元素,其子元素为/Root/Data
的{{1}}子元素。
注释:
Name
的使用不必要地很尴尬。您可能已经看过
为了克服命名空间,该技术已在其他地方完成,不应该这样做
通常,尤其是这里没有必要,因为
没有名称空间在起作用。答案 1 :(得分:0)
尝试使用此XPath,并记住XPath是区分大小写的:
//Value[../Key='Field2' and ../../../Name='Customer']/text()