我有一个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"]);
}
}
我可以看到从MyMetadata
到objectNode
节点我可以使用以下
objectNode.SelectNodes("../MyMetadata")
要获取MyMetadataObjects,我需要以下内容:
objectNode.SelectNodes("../MyMetadata/MyMetadataObject")
但是我需要对这些节点进行过滤,这就是我的问题所在:
objectNode.SelectNodes("../MyMetadata/MyMetadataObject[./@value = /*objectNodes's @guid*/")
如何找到所有MyDocument/MyMetadata/MyMetadataObject
个@value
属性与@value
MyDocument/MyKeyValue
属性相匹配的{{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"]);
}
}