XPath:根据另一个节点值选择节点

时间:2011-09-21 23:27:37

标签: xpath .net-4.0 xpath-2.0

我正在尝试使用单个XPath表达式来选择具有与文档中的另一个节点匹配的子节点的节点。

匹配意味着节点的 ALL 属性相同。因此,如果将一个节点与几个属性进行比较,那么进行单个属性比较将是不可维护的。

作为示例,给出以下内容:

<Network>
    <Machines>
        <Machine Name = "MyMachine">
            <Services>
                 <ServiceDetails Description="MyService" Executable="c:\Myservice.exe" DisplayName="My Service" Version="5"/>
            </Services>
        </Machine>
        ...
    </Machines>
    <Services>
        <Service Name = "Service1">
            <ServiceDetails Description="MyService" Executable="c:\Myservice.exe" DisplayName="My Service" Version="5"/>
        </Service>
        ...
    </Services>
</Network>

我想根据MyMachine下列出的ServiceDetails从服务中获取服务节点。

我认为它看起来像:

//Services/Service[ServiceDetails = //Machines/Machine[@Name='MyMachine']/ServiceDetails]

但它似乎不起作用。我怀疑'='运算符没有正确处理节点比较。我认为有一些XPath 2.0方法可能有效,但我使用的是.NET 4.0(System.XML命名空间)我不知道是否可以使用它们。如果XPath 2.0方法在这里有所帮助,我真的很感激如何在.Net 4.0中使用它们的解释。

由于

2 个答案:

答案 0 :(得分:4)

使用

/*/Services/Service
            [ServiceDetails/@Description 
            = 
             /*/Machines/Machine[@Name = "MyMachine"]
                          /Services/ServiceDetails/@Description
            ]

答案 1 :(得分:0)

尝试此操作将验证两个元素中的所有属性值均相等,然后为真:

/Network[(descendant::ServiceDetails/@Description = /Network//Machine[@Name = "MyMachine"]/Services/ServiceDetails/@Description) and (descendant::ServiceDetails/@Executable = /Network//Machine[@Name = "MyMachine"]/Services/ServiceDetails/@Executable) and (descendant::ServiceDetails/@DisplayName = /Network//Machine[@Name = "MyMachine"]/Services/ServiceDetails/@DisplayName) and (descendant::ServiceDetails/@Version = /Network//Machine[@Name = "MyMachine"]/Services/ServiceDetails/@Version)]