查找具有匹配属性值的相关节点

时间:2014-07-24 12:52:40

标签: c# xml xmldocument xmlnode

我有一个xml文档,其结构如下:

<MyDocument>
  <MyObject>
    <MyKeyValue value="1"/>
    <MyKeyValue value="2"/>
  </MyObject>
  <MyObject>
    <MyKeyValue value="3"/>
  </MyObject>
  <MyMetadata>
    <MyMetadataObject value="1" dataIWant="abc"/>
    <MyMetadataObject value="2" dataIWant="def"/>
    <MyMetadataObject value="3" dataIWant="ghi"/>
  </MyMetadata>
</MyDocument>

在我的代码中,我按如下方式遍历每个MyObject节点:

foreach (XmlNode objectNode in document.SelectNodes("//MyObject"))
{   
    // I want each //MyMetadata/MyMetadataObject where the 
    // metadata @value attribute equals my objectNode's @value
    foreach (XmlNode metadataNode in documentNode.SelectNodes(/* WHAT XPATH */))
    {
        myListOfData.Add(metadataNode.Attributes["dataIWant"]);     
    }
}

我可以看到从MyMetadataobjectNode节点我可以使用以下

objectNode.SelectNodes("../MyMetadata")

要获取MyMetadataObjects,我需要以下内容:

objectNode.SelectNodes("../MyMetadata/MyMetadataObject")

但是我需要对这些节点进行过滤,这就是我的问题所在:

objectNode.SelectNodes("../MyMetadata/MyMetadataObject[./@value = /*objectNodes's @guid*/")

如何找到所有MyDocument/MyMetadata/MyMetadataObject@value属性与@value

中的MyDocument/MyKeyValue属性相匹配的{{1}}

1 个答案:

答案 0 :(得分:1)

&#34; ...元数据@value属性等于我的objectNode&#39; @value &#34;。我不清楚,因为objectNode可能有多个值。也许这样的事情是可以接受的(我假设将外部循环改为每个<MyKeyValue>节点都很好):

foreach (XmlNode objectNode in document.SelectNodes("//MyObject/MyKeyValue"))
{
    var xpath = string.Format("../../MyMetadata/MyMetadataObject[@value='{0}']", 
                                objectNode.Attributes["value"].Value);
    foreach (XmlNode metadataNode in objectNode.SelectNodes(xpath))
    {
        myListOfData.Add(metadataNode.Attributes["dataIWant"]);
    }
}