2011-10-12 47 views
3

我正在嘗試使用log4net從WCF服務記錄一些XML響應。單行而不是格式的C#XMLElement.OuterXML

我希望XML文件的輸出到日誌,以正確形成XML。請求以XMLElement的形式出現。

實施例:

的請求到來時,因爲這:

<?xml version="1.0" encoding="utf-8"?> 
<ApplicationEvent xmlns="http://courts.wa.gov/INH_TV/ApplicationEvent.xsd"> 
    <Severity xmlns="">Information</Severity> 
    <Application xmlns="">Application1</Application> 
    <Category xmlns="">Timings</Category> 
    <EventID xmlns="">1000</EventID> 
    <DateTime xmlns="">2012-09-02T12:05:15.234Z</DateTime> 
    <MachineName xmlns="">Server1</MachineName> 
    <MessageID xmlns="">10000000-0000-0000-0000-000000000000</MessageID> 
    <Program xmlns="">Progam1</Program> 
    <Action xmlns="">Entry</Action> 
    <UserID xmlns="">User1</UserID> 
</ApplicationEvent> 

然後,如果我輸出該值到log4net的。

logger.Info(request.OuterXml); 

我得到記錄在一個單一的線,像這樣整個文檔:

<ApplicationEvent xmlns="http://courts.wa.gov/INH_TV/ApplicationEvent.xsd"><Severity xmlns="">Information</Severity><Application xmlns="">Application1</Application><Category xmlns="">Timings</Category><EventID xmlns="">1000</EventID><DateTime xmlns="">2012-09-02T12:05:15.234Z</DateTime><MachineName xmlns="">Server1</MachineName><MessageID xmlns="">10000000-0000-0000-0000-000000000000</MessageID><Program xmlns="">Progam1</Program><Action xmlns="">Entry</Action><UserID xmlns="">User1</UserID></ApplicationEvent> 

我想它在正確格式化的log.txt文件顯示,因爲它排在迄今爲止的唯一路上我發現這樣做,這是將其轉換爲一個的XElement像這樣:

XmlDocument logXML = new XmlDocument(); 
logXML.AppendChild(logXML.ImportNode(request, true)); 
XElement logMe = XElement.Parse(logXML.InnerXml); 
logger.Info(logMe.ToString()); 

這似乎不是很好的編程給我。我一直在搜索文檔,我無法找到一個內置的方式來正確輸出,而無需轉換。

有沒有一種明顯的,更好的方式,我只是想念?

edit1:由於OuterXML是一個字符串值,所以刪除了ToString()。

EDIT2:我回答我自己的問題:

所以我做了一些更多的研究,我想我錯過了文檔中的一段代碼。

http://msdn.microsoft.com/en-us/library/system.xml.xmlnode.outerxml.aspx

我有它歸結爲:

using (MemoryStream ms = new MemoryStream()) 
     { 
      XmlWriterSettings xws = new XmlWriterSettings(); 
      xws.Indent = true; 
      using (XmlWriter xmlWriter = XmlWriter.Create(ms, xws)) 
      { 
       request.WriteTo(xmlWriter); 
      } 
      ms.Position = 0; StreamReader sr = new StreamReader(ms); 
      string s = sr.ReadToEnd(); // s will contain indented xml 
      logger.Info(s); 
     } 

這比我現在的方法有點更高效的是,儘管是更詳細。

回答

10

XElement解析是最乾淨的方式。你可以省下一兩行:

logger.Info(XElement.Parse(request.OuterXml).ToString()); 
+0

謝謝,我不知道爲什麼我錯過了。絕對比我目前的設置更可讀。 – noodles

相關問題