C# XMLElement.OuterXML 在一行而不是格式

标签 c# .net xml tostring

我正在尝试使用 log4net 记录来自 WCF 服务的一些 XML 响应。

我希望 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);
        }

虽然比较冗长,但比我目前的方法更有效。

最佳答案

XElement 解析是最干净的方法。您可以使用以下方法保存一两行:

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

关于C# XMLElement.OuterXML 在一行而不是格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7744320/

相关文章:

c# - 当构建 ".Net Standard"项目时 - 这意味着什么?

c# - 为什么 StringBuilder 类是密封的?

c# - 将 & 添加到 XmlElement

java - 安卓错误 "The application may be doing too much work on its main thread"

c# - 将变量设置为包含方法的名称

.net - 如果我必须为 Oracle .net Entity Framework 在 app.config 中定义每个字段,ORM 的意义是什么

c# - 尝试从 appsettings.json 读取 Serilog 配置

java - 告诉 Jetty 在 webapp 更改时重新加载,而不是 context.xml 更改

c# - 如何使用C#有效地从windows事件目录中获取用户列表

c# - 如何在 C# 中打开与 Microsoft Access 数据库的连接