1

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

匹配意味着节点的所有属性都相同。因此,如果将一个节点与多个属性进行比较,则进行单独的属性比较将是不可维护的。

例如,给出以下内容:

<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 中获取服务节点。

我认为它看起来像:

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

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

谢谢

4

2 回答 2

4

使用

/*/Services/Service
            [ServiceDetails/@Description 
            = 
             /*/Machines/Machine[@Name = "MyMachine"]
                          /Services/ServiceDetails/@Description
            ]
于 2011-09-22T01:28:19.730 回答
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)]
于 2020-09-01T08:26:46.880 回答