首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单行中的C# XMLElement.OuterXML,而不是格式化

单行中的C# XMLElement.OuterXML,而不是格式化
EN

Stack Overflow用户
提问于 2011-10-13 01:52:42
回答 1查看 9.2K关注 0票数 7

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

我希望日志中的XML文件的输出采用正确的XML格式。请求以XMLElement的形式传入。

示例:

请求如下所示:

代码语言:javascript
复制
<?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。

代码语言:javascript
复制
logger.Info(request.OuterXml);

我在一行中记录了整个文档,如下所示:

代码语言:javascript
复制
<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,如下所示:

代码语言:javascript
复制
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

我把它归结为:

代码语言:javascript
复制
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);
        }

这比我现在的方法更有效一些,尽管它更冗长。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-13 02:03:53

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

代码语言:javascript
复制
logger.Info(XElement.Parse(request.OuterXml).ToString()); 
票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7744320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档