/ / Знайдіть споріднені вузли із відповідним значенням атрибута - c #, xml, xmldocument, xmlnode

Знайдіть пов'язані вузли з відповідним значенням атрибута - 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"]);
}
}

Я бачу, щоб дістатися до 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"]);
}
}