含的命名空间XML元素的XDocument或解析的XElement(XDocument or XEl

2019-06-27 14:05发布

我尝试阅读下面的字符串,从log4net的UdpAppender抓获。

<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的”是一个未声明的命名空间。 行1,位置2。

我知道我可以查找和替换“log4net的:”在原始字符串并删除它,让我成功地解析XML,但有没有更好的办法? 这是捕获的完整数据(重新格式化,以允许读出),也有由或移除没有XML命名空间声明..

Answer 1:

首先,创建的XmlNamespaceManager类的实例,并添加您的命名空间的是,如

    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 );
}


Answer 2:

你真的只有两个选择:

  1. 地带“log4net的:”从XML,如你所说,
  2. 修改XML声明命名空间,可能是最容易被包裹在具有声明中的根元素的片段(通过StringBuilder的)来完成。

严格地说,你的例子是异常的XML - 这是毫不奇怪的XDocument /的XElement不会解析它。



Answer 3:

你可以使用类似的东西:

<event xmlns="http://..." >
    <message xmlns="http://...">...</message>
</event>


文章来源: XDocument or XElement parsing of XML element containing namespaces