c# – XmlElement.SelectNodes(..) – 什么也找不到..帮忙?

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

我有一个看起来像这样的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,其中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表达式中.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...