2009-08-02 142 views
12

我尝试读取从log4net UdpAppender捕获的以下字符串。包含名称空间的XML元素的XDocument或XElement解析

<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命名空间声明..

回答

18

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

-1使用`new XmlTextReader()`,从.NET 2.0开始弃用。 – 2012-05-18 01:21:41

11

你真的只有两个选择:

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

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

-1

你可以使用类似的东西:

<event xmlns="http://..." > 
    <message xmlns="http://...">...</message> 
</event> 
相关问题