C#XPATH选择子节点内部文本所在的属性

时间:2011-08-17 12:07:20

标签: c# .net xml xpath

我有这个XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<karteikasten>
  <vokabel stufe="1">
    <eng>
      <item>Hi</item>
      <item>Hello</item>
    </eng>
    <de>
      <item>Hallo</item>
      <item>Moin</item>
    </de>
  </vokabel>
  <vokabel stufe="1">
    <eng>
      <item>Eating</item>
    </eng>
    <de>
      <item>Essen</item>
      <item>Mampfen</item>
    </de>
  </vokabel>
</karteikasten>

我想选择属性“stufe”,其中<item&gt;是“嗨”,“你好”或其他什么。我有这个代码,有效:

XPathDocument document = new XPathDocument(@"C:\test.xml");
XPathNavigator navigator = document.CreateNavigator();

XPathExpression expression;
expression = navigator.Compile("/karteikasten/vokabel[eng/item]/@stufe");
XPathNodeIterator iterator = navigator.Select(expression);

while (iterator.MoveNext())
{
  XPathNavigator navigator2 = iterator.Current.Clone();
  Console.WriteLine(navigator2.Value);
}

但是这会选择整个文档中的每个“stufe”。

expression = navigator.Compile("/karteikasten/vokabel[eng/item='Hi']/@stufe");

不起作用。什么样的模式可以得到我想要的东西?

2 个答案:

答案 0 :(得分:4)

在某些解析器中,您的表达式实际上将按写入方式工作。在.NET中,我认为您需要使用text()函数,如:

/karteikasten/vokabel[eng/item/text()='Hi']/@stufe

答案 1 :(得分:0)

尝试:

expression = navigator.Compile("/karteikasten/vokabel[eng/item='Hi' and @stufe='1']/@stufe");

应该有效