我有一个应用程序,需要加载XML文档并根据XPath输出节点。
假设我有以下这样的文档:
<aaa>
...[many nodes here]...
<bbb>text</bbb>
...[many nodes here]...
<bbb>text</bbb>
...[many nodes here]...
</aaa>
使用XPath
//bbb
,目前一切都很好。选择doc.SelectNodes("//bbb");
会返回所需节点列表。然后有人上传了一个只有一个节点<myfancynamespace:foo/>
和根标记中的额外命名空间的文档,所有的东西都崩溃了。为什么?
//bbb
与myfancynamespace
无关,理论上甚至应该使用//myfancynamespace:foo
更好,因为没有歧义,但是表达式返回0个结果,就是这样。这种行为是否有解决方法?
我确实有一个文档的命名空间管理器,并将其传递给XPath查询。但是我不知道命名空间和前缀,因此无法在查询之前添加它们。
我必须在执行任何选择之前预解析文档以填充命名空间管理器吗?这种行为为什么存在,这根本没有意义。
编辑:
我正在使用:
XmlDocument
和XmlNamespaceManager
编辑2:XmlDocument doc = new XmlDocument();
doc.XmlResolver = null;
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
//I wish I could:
//nsmgr.AddNamespace("magic", "http://magicnamespaceuri/
//...
doc.LoadXML(usersuppliedxml);
XmlNodeList nodes = doc.SelectNodes(usersuppliedxpath, nsmgr);//usersuppliedxpath -> "//bbb"
//nodes.Count should be > 0, but with namespaced document they are 0
编辑3: 发现了一篇文章,描述了一个实际场景的问题,并提出了一个解决方法,但不是很美观的解决方法: http://codeclimber.net.nz/archive/2008/01/09/How-to-query-a-XPath-doc-that-has-a-default.aspx
似乎去掉xmlns是解决问题的方法...