我如何列出XML中的所有命名空间?

12 .net c# xml namespaces

我的基本要求是从XML文件中获取元素值,我使用了XMLDoxument.SelectSingleNode.我的XML文件在头文件中包含一些Namespace,所以我使用了NameSpaceManager来添加namespace-prefix,并且我使用了prefix来获取该特定元素.现在在我的XML文件中,命名空间变得越来越多,我不想做任何硬编码,有什么方法可以找到所有命名空间,我可以将它添加到NameSpaceManager.

谢谢.

sam*_*bar 14

命名空间可以在xml文档中的任何位置找到.因此,要提取所有名称空间并将它们声明为XmlNamespaceManager,我执行了以下操作:

public static XmlNamespaceManager getAllNamespaces(XmlDocument xDoc)
{
    XmlNamespaceManager result = new XmlNamespaceManager(xDoc.NameTable);

    IDictionary<string, string> localNamespaces = null;
    XPathNavigator xNav = xDoc.CreateNavigator();
    while (xNav.MoveToFollowing(XPathNodeType.Element))
    {
        localNamespaces = xNav.GetNamespacesInScope(XmlNamespaceScope.Local);
        foreach (var localNamespace in localNamespaces)
        {
            string prefix = localNamespace.Key;
            if (string.IsNullOrEmpty(prefix))
                    prefix = "DEFAULT";

            result.AddNamespace(prefix, localNamespace.Value);
        }
    }

    return result;
}
Run Code Online (Sandbox Code Playgroud)

只需注意默认的命名空间情况.我将默认命名空间重新定义为"DEFAULT"前缀,因为在查询默认命名空间时使用上面返回的命名空间管理器制作SelectSingleNode时遇到问题.我是我的解决方法.希望这可以帮助


小智 8

谢谢你快速的回复...

我认为您使用的.Net版本必须是最新版本.我正在使用.Net framework 1.1 ...很老:( ..

到时候,我有一些这样的示例代码...出于同样的目的......

XmlNodeList _xmlNameSpaceList =  _xmlDocument.SelectNodes(@"//namespace::*[not(. = ../../namespace::*)]");

            _xmlNSmgr = new XmlNamespaceManager(_xmlDocument.NameTable);        

            foreach(XmlNode nsNode in _xmlNameSpaceList)
            {
                _xmlNSmgr.AddNamespace(nsNode.LocalName,nsNode.Value);
            }
Run Code Online (Sandbox Code Playgroud)

任何评论将被赞赏为我的KB添加知识...谢谢


Cer*_*rus 3

NameTable从 XmlDocument 检索命名空间的基本问题可以通过简单地检索XmlDocument 并XmlNameSpaceManager从中创建一个来解决。

但是,如果您想出于其他目的列出名称空间,则应该检查该类以及该类GetNamespacesInScope公开的方法。XmlNamespaceManagerXPathNavigator

使用 XmlDocument 时,可以通过以下代码从中获取 XmlNamespaceManager:

//Instantiate an XmlDocument object.
XmlDocument xmldoc = new XmlDocument();

//Load XML file into the XmlDocument object. 
xmldoc.Load("C:\\myFile.xml");

//Instantiate an XmlNamespaceManager object. 
XmlNamespaceManager nsMgr = new XmlNamespaceManager(xmldoc.NameTable);

// Retrieve the namespaces into a Generic dictionary with string keys.
IDictionary<string, string> dic = nsMgr.GetNamespacesInScope(XmlNamespaceScope.All);

// Iterate through the dictionary.

...
Run Code Online (Sandbox Code Playgroud)

在本文中,Scott Hanselman 介绍了一种使用此方法通过 XPathNavigator 和 LINQ 桥列出文档中的所有命名空间的方法。

  • 这种方法的问题是它忽略了“xmlns”条目。 (3认同)
  • 这似乎对我不起作用。文档的 NameTable 中有很多项,但文档开头定义的几个命名空间未添加到 XmlNamespaceManager。我在 SelectNodes 调用中不断收到“命名空间未定义”的消息,除非我手动将命名空间添加到管理器。我需要一个解决方案来准确读取 XML 文档中定义的命名空间,并将它们添加到我的命名空间管理器中,这样我就不必对它们进行硬编码。 (2认同)