c# - 包含 namespace 的 XML 元素的 XDocument 或 XElement 解析

标签 c# linq-to-xml log4net

我尝试读取从 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' is an undeclared namespace. Line 1, position 2.

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

最佳答案

首先,创建一个 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 );
}

关于c# - 包含 namespace 的 XML 元素的 XDocument 或 XElement 解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1219419/

相关文章:

c# - C# 中的 RSA 签名和 C++ 中的 Crypto++ 验证

c# - 如何让 Autofixture 创建一个类型的实例,该实例包含具有接口(interface)类型的属性?

c# - 在不同的类中实现 INotifyPropertyChanged

c# - XML Writer 将结果存储到字符串

c# - 为什么这个 LINQ to XML 不起作用?

configuration - 配置 log4net 根据级别将错误发送到不同的appender

c# - 如何在 C# 中删除或替换 "\"

c# - 通过 for 循环将一个 XML 文件插入到另一个文件中 (XDocument)

c# - MSTest 失败 : Failed to find configuration section 'log4net' in the application's . 配置文件

log4net - 为什么 log4net 不记录我的堆栈跟踪?