【问题标题】:C# XPATH Select Attribute where child node inner Text isC# XPATH 选择子节点内部文本所在的属性
【发布时间】:2011-08-17 12:07:20
【问题描述】:

我有这个 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”,其中&lt;item> 是“Hi”、“Hello”或其他。我有这个代码,它可以工作:

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");

不起作用。得到我想要的东西的正确模式是什么?

【问题讨论】:

  • 表达式 = navigator.Compile("/karteikasten/vokabel[eng/item='Hi']/@stufe");为我工作。您使用的是哪个版本的 .NET?

标签: c# .net xml xpath


【解决方案1】:

在某些解析器中,您的表达式实际上会按照所写的那样工作。在.NET中,我相信你需要使用text()函数,如:

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

【讨论】:

    【解决方案2】:

    试试:

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

    应该可以的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 1970-01-01
      • 1970-01-01
      • 2012-03-24
      • 2018-03-15
      • 2011-06-13
      相关资源
      最近更新 更多