Ray*_*yes 15 c# log4net linq-to-xml
我尝试读取从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>
Run Code Online (Sandbox Code Playgroud)
在尝试XElement.Parse或XDocument.Parse内容时,它会抛出异常:
'log4net'是未声明的命名空间.第1行,第2位.
我知道我可以在原始字符串中搜索并替换"log4net:"并删除它,允许我成功解析XML,但是有更好的方法吗?这是捕获的完整数据(重新格式化以允许读取),没有制作或删除xml命名空间声明.
Soo*_*nts 21
首先,创建一个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" );
Run Code Online (Sandbox Code Playgroud)
要使用这些命名空间映射解析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 );
}
Run Code Online (Sandbox Code Playgroud)
Ben*_*n M 11
你真的只有两个选择:
严格地说,您的示例是格式错误的XML - XDocument/XElement不会解析它也就不足为奇了.