我有这个XML文档:
<?xml version="1.0" encoding="utf-8"?>
<document xmlns="file:///someurl/goes.here">
<levelone>
<leveltwo>
<title>Test Title</title>
<item>Item 1</item>
<item>Item 2</item>
<item>Item 3</item>
</leveltwo>
</levelone>
</document>
这段代码:
static void Main(string[] args)
{
XmlDocument fileIn = new XmlDocument();
fileIn.Load("XMLFile1.xml");
XmlNamespaceManager nsm = new XmlNamespaceManager(fileIn.NameTable);
nsm.AddNamespace(String.Empty, "file:///someurl/goes.here");
XmlNode docElem = fileIn.DocumentElement;
string title = docElem.SelectSingleNode("levelone/leveltwo/title", nsm).InnerText;
Console.WriteLine("Title: " + title);
Console.WriteLine("Items: " + docElem.SelectNodes("//item", nsm).Count);
Environment.Exit(0);
}
如果我运行此操作,当我尝试获取我尝试为NullReferenceException
选择的节点的InnerText
时,我会收到title
。但是,如果我将AddNamespace
调用更改为nsm.AddNamespace("a", "file:///someurl/goes.here")
并更新所有XPath以使用该a
命名空间,那么它可以正常工作。
我的理解是XPath中没有前缀的元素引用空命名空间。 String.Empty
is said to be for the empty namespace in MSDN's docs,我给NamespaceManager
空命名空间的正确名称空间URI。然而它似乎没有工作,我发现自己不得不在管理器中创建一个虚拟命名空间,以使其正常工作,这真的很烦人。为什么我必须使用它或任何解决方法?
我不是在寻找一种方法来运行我的代码, 我知道上面提到的几种方法和详细的广泛接受的方法。我想知道为什么我对文档的理解导致代码损坏 - 例如这是微软的问题,还是我误解了什么?