Как вернуть внутренний текстовый узел XML, сравнивая его с тем же потомком? - PullRequest
0 голосов
/ 07 ноября 2011

У меня есть XML-файл, подобный следующему:

<Tests>
   <Test>
      <Name>Test1</Name>
      <Type>A</Type>
   </Test>
   <Test>
      <Name>Test2</Name>
      <Type>A</Type>
   </Test>
   <Test>
      <Name>Test3</Name>
      <Type>B</Type>
   </Test>
</Tests>

Как я могу вернуть строковый массив или список, который содержит только имя Test, тип которого - A?

Я пытаюсь использовать этот код, но безуспешно!

XPathNodeIterator it = nav.Select("/Tests/Test[Type = 'A']/Name)

Ответы [ 2 ]

2 голосов
/ 07 ноября 2011

Разве вы не хотите попробовать linq2xml?

using System.Xml.Linq;
using System.Linq;

///////////

XElement root = new XElement("Tests",
  new XElement("Test",
    new XElement("Name", "Test1"),
    new XElement("Type", "A")),
  new XElement("Test",
    new XElement("Name", "Test2"),
    new XElement("Type", "A")),
  new XElement("Test",
    new XElement("Name", "Test3"),
    new XElement("Type", "B")));

string[] result = (from xe in root.Elements()
                   where xe.Element("Type").Value.Equals("A")
                   select xe.Element("Name").Value).ToArray();
1 голос
/ 07 ноября 2011

Выражение XPath в вашем вопросе соответствует Name элементам.Если вы хотите сопоставить Test элементы вместо этого, вы должны удалить часть /Name:

XPathNodeIterator it = nav.Select("/Tests/Test[Type = 'A']);

Если вы хотите использовать XPathNavigator, оттуда вы можете вызвать MoveToChild() для указания навигатора на элементы Name:

foreach (XPathNavigator elemNav in it) {
    elemNav.MoveToChild("Name", "");
    string name = elemNav.Value;
    // Do something with 'name'...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...