如何将XML节点内部文本与同一后代进行比较?

时间:2011-11-07 11:12:30

标签: 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的{​​{1}}的名称?

我正在尝试使用此代码,但没有成功!

A

2 个答案:

答案 0 :(得分:2)

你不想尝试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 :(得分:1)

您问题中的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'...
}