代码之家  ›  专栏  ›  技术社区  ›  Neil C. Obremski

如何在文档中找到未知的XML命名空间?

  •  1
  • Neil C. Obremski  · 技术社区  · 16 年前

    具体来说(深呼吸):如何在C/.NET中查找所有XML名称空间? XmlDocument 在实例的 XmlSchemaSet ( Schemas 财产)?

    我的XPath魔法缺乏做这种事情的复杂性,但同时我会继续寻找……

    2 回复  |  直到 9 年前
        1
  •  1
  •   Richard    16 年前

    需要获取文档中所有不同命名空间的列表,然后将其与架构集中的不同命名空间进行比较。

    但命名空间声明名称通常不会在XPath文档模型中公开。但是给定一个节点,您可以得到它的名称空间:

    // Match every element and attribute in the document
    var allNodes = xmlDoc.SelectNodes("//(*|@*)");
    var found = new Dictionary<String, bool>(); // Want a Set<string> really
    foreach (XmlNode n in allNodes) {
      found[n.NamespaceURI] = true;
    }
    var allNamespaces = found.Keys.OrderBy(s => s);
    
        2
  •  3
  •   Mark Dellacca    14 年前

    我发现从给定的XML文档中检索所有名称空间的最简单方法是通过所有节点使用xpath查找唯一前缀和名称空间URI值。

    我有一个助手例程,用于返回xmlnamespacemanager中的这些唯一值,以便在处理复杂的XML文档时简化生活。

    代码如下:

    private static XmlNamespaceManager PrepopulateNamespaces( XmlDocument document )
    {
        XmlNamespaceManager result = new XmlNamespaceManager( document.NameTable );
        var namespaces = ( from XmlNode n in document.SelectNodes( "//*|@*" )
                           where n.NamespaceURI != string.Empty
                           select new
                           {
                               Prefix = n.Prefix,
                               Namespace = n.NamespaceURI
                           } ).Distinct();
    
        foreach ( var item in namespaces )
            result.AddNamespace( item.Prefix, item.Namespace );
    
        return result;
    }
    
    推荐文章