很抱歉打扰你这么简单的问题,但是我被困在这里一个小时:
我有一个看起来像这样的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标签中的命名空间声明,但我无法弄清楚为什么这会导致问题。或者......你能看到我可能遗失的任何东西吗?
答案 0 :(得分:10)
这是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表达式的 all 中。