我正在尝试使用单个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中使用它们的解释。
由于
答案 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)]