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

本文关键字:关节点 属性 查找 | 更新日期: 2023-09-27 18:14:30

我有一个结构如下的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"]);     
    }
}

我可以看到,要从objectNode到达MyMetadata节点,我可以使用以下

objectNode.SelectNodes("../MyMetadata")

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

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

然而,我需要一个过滤器在这些节点上,这就是我的问题所在:

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

我怎么能找到所有的MyDocument/MyMetadata/MyMetadataObject有一个@value属性匹配@value属性在MyDocument/MyKeyValue

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

"…其中元数据@value属性等于我的objectNode的@value"。我不清楚,因为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"]);
    }
}