使用XmlNamespaceManager检索所有命名空间的列表

时间:2012-03-15 15:34:44

标签: .net xml xml-namespaces

我试图在此代码中按XmlNamespaceManager获取所有已定义命名空间的列表:

var manager = new XmlNamespaceManager(xmlDoc.NameTable);
var dic = manager.GetNamespacesInScope(XmlNamespaceScope.All);

这是我的xml:

<?xml version='1.0' encoding='UTF-8'?>
<psf:PrintCapabilities 
 version='1' 
 xmlns:psf='http://schemas.microsoft.com/windows/2003/08/printing/printschemaframework' 
 xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' 
 xmlns:xsd='http://www.w3.org/2001/XMLSchema' 
 xmlns:ns0000='http://schemas.microsoft.com/windows/printing/oemdriverpt/Lexmark T650/6.1.7601.17514/' 
 xmlns:psk='http://schemas.microsoft.com/windows/2003/08/printing/printschemakeywords'>

 </psf:PrintCapabilities>

有趣的是GetNamespacesInScope()方法只返回一个项目 key =“xml”,value =“http://www.w3.org/XML/1998/namespace”

这里缺少什么?

注意:即使我使用其中一个已定义的名称空间前缀(例如添加<ns0000:a>hi</ns0000:a>),它也不会改变任何内容。

2 个答案:

答案 0 :(得分:1)

尝试使用XPathDocument以及XmlNamespaceScope ......这样的东西会起作用

 XPathDocument x = new XPathDocument(new StringReader(xml));
 XPathNavigator foo = x.CreateNavigator();
 foo.MoveToFollowing(XPathNodeType.Element);
 IDictionary<string, string> namespaces = foo.GetNamespacesInScope(XmlNamespaceScope.All);

答案 1 :(得分:0)

我相信你的问题是那些不是命名空间,那些是命名空间声明。

如果您实际上使用了这些名称空间,那么它们将作为名称表中节点上的名称空间存在,因此XmlNamespaceManager会向您显示它们。实际上,它只显示xml命名空间,它隐式存在于所有XML文档中。