Как вернуть внутренний текст XML-узла, сравнивая его с тем же потомком?

#c# #xml #xpath

#c# #xml #xpath

Вопрос:

У меня есть 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)
  

Комментарии:

1. Ваше выражение XPath правильное. Можете ли вы уточнить, что вы подразумеваете под no success ?

2. На данный момент он возвращает все Name узлы, я посмотрю еще раз и отчитаюсь.

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

4. Вы имеете в виду, что я должен использовать XPathNodeIterator it = nav.Select("/Tests/Test[Type = 'A']) ? Итак, как я могу указать на Name узел, чтобы прочитать его внутренний текст? не могли бы вы немного объяснить, пожалуйста?

Ответ №1:

Разве вы не хотите попробовать 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();
  

Ответ №2:

Выражение 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'...
}