C # XMLElement.OuterXML в одной строке, а не в формате - PullRequest
4 голосов
/ 12 октября 2011

Я пытаюсь записать некоторые ответы XML от службы WCF с использованием log4net.

Я хочу, чтобы вывод файла 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);
        }

Это немного более эффективно, чем мой нынешний метод, хотя и более многословно.

1 Ответ

12 голосов
/ 12 октября 2011

XElement parse - самый чистый способ.Вы можете сохранить одну или две строки с помощью:

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