c# - XmlElement.SelectNodes(..) - 什么也没找到..帮助?

标签 c# .net xml xmlreader

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

我有一个看起来像这样的 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 标记中的命名空间声明有问题,但我不明白为什么这会导致问题。或者..你能看到我可能遗漏的任何东西吗?

最佳答案

这是 xml 命名空间。没有ddd。但是,有 x:ddd,其中 xhttp://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 除了方便之外没有任何意义。

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

关于c# - XmlElement.SelectNodes(..) - 什么也没找到..帮助?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7954655/

相关文章:

c# - WPF编译错误

c# - 在 WebAPI C# 中请求反序列化期间捕获异常

javascript - XML/javascript 解析节点 - 按名称指定子节点

c# - .NET 服务系统.Net.Sockets.SocketException : 'No such host is known'

java - JAXB 编码 : Filter values of leaf elements

java - 未调用 XmlAdapter 将 List 适配为 Map

c# - 比较两个日期值时如何忽略时间部分?

c# - Vscode 没有多个项目的智能感知/自动完成

c# - 如何测试动态 JSON 文件中是否存在属性

c# - Process.WaitForExit() 异步