XPath:基于另一个节点值选择节点

XPath:基于另一个节点值选择节点,xpath,.net-4.0,xpath-2.0,Xpath,.net 4.0,Xpath 2.0,我试图使用一个XPath表达式来选择一个节点,该节点具有与文档中另一个节点匹配的子节点 匹配意味着节点的所有属性都相同。因此,如果将一个节点与多个属性进行比较,则单个属性的比较将无法维护 下面给出了一个示例: <Network> <Machines> <Machine Name = "MyMachine"> <Services> <ServiceDetails

我试图使用一个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>
但它似乎不起作用。我怀疑“=”运算符没有正确处理节点比较。我认为有一些XPath2.0方法可能有效,但我使用的是.NET4.0system.XML名称空间,我不知道是否可以使用它们。如果XPath 2.0方法在这里有所帮助,我将非常感谢您解释如何在.NET4.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)]

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

/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)]

您是否试图通过匹配这两个属性中的@Description属性来获得下一个属性?在这种情况下可以使用:/Network/Services/Service[ServiceDetails/@Description=/Network/Machines/Machine[@Name='MyMachine']/Services/ServiceDetails/@Description]您是否试图通过匹配这两个属性中的@Description属性来获取下一个属性?在这种情况下,这将起作用:/Network/Services/Service[ServiceDetails/@Description=/Network/Machines/Machine[@Name='MyMachine']]/Services/ServiceDetails/@Description]@DevNull:绝对-我看到了你的评论并决定给出我的答案-当我完整地写下它时,我发现它与你评论中的表达几乎相同。然而,这应该是一个答案,而不是评论。请用这个表达式创建一个答案,然后我将删除我的答案:我希望OP能在我回答之前澄清这个问题,因为XML示例与试图匹配的内容的解释不匹配。一个答案就足够了;既然我同意,我就投你的一票-谢谢-在本例中,我将查看您的所有答案-肯定会有一些我以前没有见过的好答案,我可以投票。谢谢您的回答,但问题的比较是关于整个节点的。在上面的例子中,我希望确保描述和版本都是正确的。根据您的示例,我可能能够连接属性比较,但这很快就会变得难以管理。有没有办法确定整个节点是否匹配?但是,如果此节点有多个属性或子节点,则这些表达式将很快变得非常大。是否有办法检查节点是否匹配,而不是遍历每个属性和子节点?@AAADad:您需要定义什么是“整个节点匹配”。有一个术语node equality,在XPath 2.0中有一个finction deep equal。如果您只需要浅层相等属性计数名称和相应的值就可以相同,我认为这可以通过XPath表达式来实现。@DevNull:绝对-我看到了您的注释并决定给出我的答案-当我完整地编写它时,我发现它与您注释中的表达式几乎相同。然而,这应该是一个答案,而不是评论。请用这个表达式创建一个答案,然后我将删除我的答案:我希望OP能在我回答之前澄清这个问题,因为XML示例与试图匹配的内容的解释不匹配。一个答案就足够了;既然我同意,我就投你的一票-谢谢-在本例中,我将查看您的所有答案-肯定会有一些我以前没有见过的好答案,我可以投票。谢谢您的回答,但问题的比较是关于整个节点的。在上面的例子中,我希望确保描述和版本都是正确的。根据您的示例,我可能能够连接属性比较,但这很快就会变得难以管理。有没有办法确定整个节点是否匹配?但是,如果此节点有多个属性或子节点,则这些表达式将很快变得非常大。是否有办法检查节点是否匹配,而不是遍历每个属性和子节点?@AAADad:您需要定义什么是“整个节点匹配”。有一个术语node equality,在XPath 2.0中有一个finction deep equal。如果您只需要浅层相等属性计数名称和相应的值相同,我认为这可以通过XPath表达式实现。
/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)]