2009-08-02 139 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> 
相關問題