查找具有匹配属性值的相关节点
本文关键字:关节点 属性 查找 | 更新日期: 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"]);
}
}