2011-09-21 141 views
1

我试图使用单个XPath表达式来选择具有与文档中的另一个节点相匹配的子节点的节点。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/Service[ServiceDetails = //Machines/Machine[@Name='MyMachine']/ServiceDetails] 

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

感谢

+0

你是不是想通过匹配得到''下的''了'@ Description'来自''属性? (这会在这种情况下工作:'/ Network/Services/Service [ServiceDetails/@ Description =/Network/Machines/Machine [@Name ='MyMachine']/Services/ServiceDetails/@ Description]') –

回答

4

使用

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

看起来很熟悉; - ) –

+0

@DevNull:绝对 - 我看到了你的评论,并决定给出我的答案 - 当我完全写完之后,我发现它与你评论中的表达几乎完全相同。但是,它应该成为一个答案 - 而不是一个评论。请用这个表达式创建一个答案,然后我将删除我的:) –

+0

我希望OP能够在我回答之前澄清这个问题,因为XML示例与试图匹配的内容的解释不匹配。一个答案就足够了;自从我达成一致以后,我会为你提供支持。 :-) –

相关问题