【问题标题】:XmlElement.SelectNodes(..) - finds nothing.. Help?XmlElement.SelectNodes(..) - 什么也没找到.. 帮助?
【发布时间】:2011-12-18 18:32:28
【问题描述】:

很抱歉用这么简单的问题打扰你,但我被困在这里已经一个小时了:

我有一个看起来像这样的 xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<aaa xmlns="http://blabla.com/xmlschema/v1">

  <bbb>
    <ccc>Foo</ccc>
  </bbb>

  <ddd x="y" />
  <ddd x="xx" />
  <ddd x="z" />

</aaa>

我正在尝试像这样访问元素“ddd”:

var doc = new XmlDocument();
doc.Load("example.xml");
foreach (XmlNode dddNode in doc.DocumentElement.SelectNodes("//ddd"))
{
   // do something
   Console.WriteLine(dddNode.Attributes["x"].Value);
}

在运行时会跳过 foreach 循环,因为我没有从 .SelectNodes 方法返回任何节点。我在循环之前中断并查看了 InnerXML,看起来不错,我还尝试了各种 XPath(如“//bbb”或“/aaa/ddd”),但只有“/”似乎没有返回空。

这个确切的代码以前对我有用,现在不行了。我怀疑 aaa 标记中的命名空间声明有什么问题,但我不明白为什么这会导致问题。或者..你能看到我可能遗漏的任何东西吗?

【问题讨论】:

    标签: c# .net xml xmlreader


    【解决方案1】:

    这是 xml 命名空间。没有ddd。但是,x:ddd 其中x 是您对http://blabla.com/xmlschema/v1 的别名。您需要使用命名空间进行测试 - 例如:

    var nsmgr = new XmlNamespaceManager(doc.NameTable);
    nsmgr.AddNamespace("x", "http://blabla.com/xmlschema/v1");
    var nodes = doc.DocumentElement.SelectNodes("//x:ddd", nsmgr);
    // nodes has 3 nodes
    

    上面的注x是任意的; x除了方便之外没有其他意义。

    这(相当不便)意味着将命名空间(或别名,如上所述)添加到您的 xpath 表达式的所有中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-12
      • 1970-01-01
      • 1970-01-01
      • 2014-11-13
      • 2019-09-18
      • 1970-01-01
      • 2019-08-22
      • 2012-01-10
      相关资源
      最近更新 更多