【发布时间】:2011-10-12 17:52:41
【问题描述】:
我正在尝试使用 log4net 记录来自 WCF 服务的一些 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:删除了 ToString(),因为 OuterXML 是一个字符串值。
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);
}
尽管更冗长,但比我当前的方法更有效。
【问题讨论】: