У мене є 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 для відповіді № 1"... де метадані @value
атрибут дорівнює моєму objectNode
"s @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"]);
}
}