#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'...
}