Как сохранить все XML-форматирование с помощью XDocument? - PullRequest
8 голосов
/ 15 декабря 2011

Я пытаюсь прочитать файл конфигурации XML, сделать несколько настроек (найти и удалить или добавить элемент) и сохранить его снова.Я хочу, чтобы это редактирование было как можно более незаметным, поскольку файл будет находиться под контролем исходного кода, и я не хочу, чтобы несущественные изменения вызывали конфликты слияния и т. Д. Это примерно то, что я получил:

XDocument configDoc = XDocument.Load(fileName, LoadOptions.PreserveWhitespace);
// modifications to configDoc here
configDoc.Save(fileName, SaveOptions.DisableFormatting);

Здесь возникает несколько проблем:

  1. encoding="utf-8" добавляется в объявление xml.
  2. <tag attr="val"/> изменяется на <tag attr="val" />
  3. Атрибуты, которые были разбросаны по отдельным строкам для удобства чтения, помещаются все в одну строку.

Есть ли способ быть менее навязчивым с XDocument, или мне просто нужно попробовать и отредактировать строку, чтобыполучить то, что я хочу?

Ответы [ 2 ]

5 голосов
/ 15 декабря 2011

Объектная модель LINQ to XML не хранит информацию о том, помечен ли проанализированный элемент как <foo/> или <foo />, поэтому при повторном сохранении такая информация теряется. Если вы хотите обеспечить определенный формат, вы можете расширить реализацию XmlWriter и переопределить его http://msdn.microsoft.com/en-us/library/system.xml.xmlwriter.writeendelement.aspx, но таким образом вы также не сохраните формат ввода, вместо этого вы выписаете все пустые элементы как <foo/> какой бы формат вы ни использовали в своем методе.

Возможны и другие изменения, например, при загрузке файла.

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:xhtml="http://www.w3.org/1999/xhtml">
  <head>
    <title>Example</title>
  </head>
  <body>
    <h1>Example</h1>
  </body>
</html>

и сохранение его обратно -

<xhtml:html xmlns="http://www.w3.org/1999/xhtml" xmlns:xhtml="http://www.w3.org/1999/xhtml">
  <xhtml:head>
    <xhtml:title>Example</xhtml:title>
  </xhtml:head>
  <xhtml:body>
    <xhtml:h1>Example</xhtml:h1>
  </xhtml:body>
</xhtml:html>

, поэтому не ожидайте сохранения деталей разметки при загрузке / сохранении с помощью XDocument / XElement.

1 голос
/ 25 марта 2015

Чтобы избежать объявления в заголовке документа, вы можете использовать следующее

    XmlWriterSettings settings = new XmlWriterSettings();
    settings.OmitXmlDeclaration = true;


        using (XmlWriter xw = XmlWriter.Create(fileName, settings))
        {
            doc.Save(xw);
        }
...