XPath根据多种条件选择XML节点的值

时间:2018-06-25 19:04:21

标签: xml xpath

以下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,而是结构的简化表示。我还看到了有关区分大小写的注释,并编辑了我的代码以更准确地反映给定的示例。

2 个答案:

答案 0 :(得分:0)

此XPath,

/Root[Name="Customer"]/Data/KeyValuePair[Key="Field2"]/Value/text()

将选择Value元素内的KeyValuePair元素的所有文本节点以及其子元素为Key的{​​{1}}子元素,前提是"Field2"KeyValuePair元素的子元素,其子元素为/Root/Data的{​​{1}}子元素。

注释:

  1. XML和XPath区分大小写。
  2. 您对Name的使用不必要地很尴尬。您可能已经看过 为了克服命名空间,该技术已在其他地方完成,不应该这样做 通常,尤其是这里没有必要,因为 没有名称空间在起作用。

答案 1 :(得分:0)

尝试使用此XPath,并记住XPath是区分大小写的:

//Value[../Key='Field2' and ../../../Name='Customer']/text()