代码之家  ›  专栏  ›  技术社区  ›  Ray Hayes

包含名称空间的XML元素的XDocument或XElement解析

  •  13
  • Ray Hayes  · 技术社区  · 17 年前

    <log4net:event logger="TestingTransmitter.Program" 
                   timestamp="2009-08-02T17:50:18.928+01:00" 
                   level="ERROR" 
                   thread="9" 
                   domain="TestingTransmitter.vshost.exe" 
                   username="domain\user">
        <log4net:message>Log entry 103</log4net:message>
        <log4net:properties>
            <log4net:data name="log4net:HostName" value="machine" />
        </log4net:properties>
    </log4net:event>
    

    尝试XElement.Parse或XDocument.Parse内容时,会引发异常:

    “log4net”是一个未声明的命名空间。

    我知道我可以搜索并替换原始字符串中的“log4net:”并将其删除,这样我就可以成功解析XML了,但还有更好的方法吗?这是捕获的完整数据(重新格式化以允许读取),没有进行或删除xml命名空间声明。。

    3 回复  |  直到 17 年前
        1
  •  21
  •   Soonts    14 年前

        XmlNamespaceManager mngr = new XmlNamespaceManager( new NameTable() );
        mngr.AddNamespace( "xsi", "http://www.w3.org/2001/XMLSchema-instance" );
        mngr.AddNamespace( "xsd", "http://www.w3.org/2001/XMLSchema" );
    

    要使用这些名称空间映射解析XML字符串,请调用以下函数,将已添加的名称空间传递给XmlNamespaceManager实例:

    /// <summary>Same as XElement.Parse(), but supports XML namespaces.</summary>
    /// <param name="strXml">A String that contains XML.</param>
    /// <param name="mngr">The XmlNamespaceManager to use for looking up namespace information.</param>
    /// <returns>An XElement populated from the string that contains XML.</returns>
    public static XElement ParseElement( string strXml, XmlNamespaceManager mngr )
    {
        XmlParserContext parserContext = new XmlParserContext( null, mngr, null, XmlSpace.None );
        XmlTextReader txtReader = new XmlTextReader( strXml, XmlNodeType.Element, parserContext );
        return XElement.Load( txtReader );
    }
    
        2
  •  11
  •   Ben M    17 年前

    您实际上只有两个选择:

    1. 按照您的建议,从XML中去掉“log4net:”;
    2. 修改XML以声明名称空间,最简单的方法可能是将片段(通过StringBuilder)包装到具有该声明的根元素中。

    严格地说,您的示例是格式错误的XML——毫不奇怪XDocument/XElement不会解析它。

        3
  •  -1
  •   Rock Legendre    11 年前

    <event xmlns="http://..." >
        <message xmlns="http://...">...</message>
    </event>
    
    推荐文章