C# XMLElement.OuterXML in a single line rather than format

依然范特西╮ 提交于 2019-12-07 10:39:13

问题


I am trying to log some XML responses from a WCF Service using log4net.

I want the output of the XML file to the log to be in properly formed XML. The request comes in as an XMLElement.

Example:

The request comes in as this:

<?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>

Then if I output this value to log4net.

logger.Info(request.OuterXml);

I get the entire document logged in a single line like so:

<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>

I would like it to display in the log.txt file formatted correctly as it came in. So far the only way I have found to do this is to convert it to an XElement like so:

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

This doesn't seem like good programming to me. I have been searching the documentation and I can't find a built-in way to output this correctly without converting it.

Is there an obvious, better way that I am just missing?

edit1: Removed ToString() since OuterXML is a String value.

edit2: I answered my own question:

So I did some more research, and I guess I missed a piece of code in the documentation.

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

I have it down to:

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);
        }

Which is a little more efficient than my current method despite being more verbose.


回答1:


XElement parse is the cleanest way. You can save a line or two with:

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


来源:https://stackoverflow.com/questions/7744320/c-sharp-xmlelement-outerxml-in-a-single-line-rather-than-format

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!