xpath查询在联机工具中工作但在我通过代码测试时没有返回值

时间:2011-08-17 03:52:06

标签: c# .net xml xpath

  <Header>
      <reference>
        <identifier>BatchProcessed</identifier>
        <datetime>2011-08-15T05:12:00+10:00</datetime>
      </reference>
    </Header>
    <Header>
      <reference>
        <identifier>Running</identifier>
        <datetime>2011-08-15T05:12:00+10:00</datetime>
      </reference>
    </Header>

我的xpath查询是

XmlNode node3 = xdoc.SelectSingleNode("//identifier/text()");

查询假设获取第一个标识符值“BatchProcessed”。

但是当我测试时它返回null但是当我在xml工具(在线)中使用路径时它会重新计算值。

我不知道这里缺少什么,有人启发我

1 个答案:

答案 0 :(得分:2)

看起来您的xml文档缺少根元素。我添加了一个<Root>节点来包装两个<Header>节点。下面的代码显示了如何通过利用XPath请求来检索预期值 BatchProcessed

var xml = @"<Root><Header>
    <reference>
    <identifier>BatchProcessed</identifier>
    <datetime>2011-08-15T05:12:00+10:00</datetime>
    </reference>
</Header>
<Header>
    <reference>
    <identifier>Running</identifier>
    <datetime>2011-08-15T05:12:00+10:00</datetime>
    </reference>
</Header></Root>";

var xdoc = new XmlDocument();
xdoc.LoadXml(xml);

XmlNode node3 = xdoc.SelectSingleNode("//identifier/text()");
Console.WriteLine(node3.Value); // -> "BatchProcessed"

缺少的根节点也有可能带有默认命名空间(这增加了一点复杂性)。下面的代码演示了如何解决这个问题。

var xml = @"<Root xmlns=""http://www.example.com/schemas/0.1""><Header>
    <reference>
    <identifier>BatchProcessed</identifier>
    <datetime>2011-08-15T05:12:00+10:00</datetime>
    </reference>
</Header>
<Header>
    <reference>
    <identifier>Running</identifier>
    <datetime>2011-08-15T05:12:00+10:00</datetime>
    </reference>
</Header></Root>";

var xdoc = new XmlDocument();
xdoc.LoadXml(xml);

var ns = new XmlNamespaceManager(new NameTable());
ns.AddNamespace("ns", "http://www.example.com/schemas/0.1");

XmlNode node3 = xdoc.SelectSingleNode("//ns:identifier/text()", ns);
Console.WriteLine(node3.Value); // -> "BatchProcessed"