Как нормализовать отступы, но не разрывы строк при сериализации / чтении XML в C # - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть XML-документ, который я хочу сериализовать с нормализованными отступами (используя два пробела), но сохраняя любые дополнительные разрывы строк между элементами.Я использую C #.Желательно, чтобы нормализовался разрыв строки символов (поэтому они все \r\n), но, главное, я бы хотел сохранить наличие нескольких последовательных разрывов строки.

Например,учитывая входной документ:

<root>
    <elementOne>Hello</elementOne>
  <elementTwo>I am misaligned</elementTwo>
        <elementThree>I am indented with a Tab character</elementThree>

    <!-- Here is a comment preceeding another element -->
    <elementFour />
  </root>

Я хотел бы создать выходной документ:

<root>
    <elementOne>Hello</elementOne>
    <elementTwo>I am slightly misaligned</elementTwo>
    <elementThree>I am indented with a Tab character</elementThree>

    <!-- Here is a comment preceeding another element -->
    <elementFour />
</root>

Если я проанализирую входной документ в XElement, а затем сериализую его, я получувывод с нормализованным интервалом, но удален дополнительный разрыв строки:

<root>
    <elementOne>Hello</elementOne>
    <elementTwo>I am slightly misaligned</elementTwo>
    <elementThree>I am indented with a Tab character</elementThree>
    <!-- Here is a comment preceeding another element -->
    <elementFour />
</root>

Я попытался использовать XDocument.Load с LoadOptions.PreserveWhitespace, но потом не могу найти способ нормализации отступа.Я также попытался использовать XmlWriterSettings следующим образом:

XmlWriterSettings settings = new XmlWriterSettings {
    Indent = true,
    IndentChars = "  ",
    NewLineChars = "\r\n",
    NewLineHandling = NewLineHandling.None
};

Но настройка этих настроек, кажется, либо нормализует оба отступа строки и , либо ни того, ни другого.

Причина, по которой мне нужно такое поведение, заключается в том, что я хочу «красиво распечатать» большой редактируемый пользователем XML-документ, чтобы отступ был правильным, но я не хочу удалять разрывы строк, добавленные пользователем, для удобства чтения.

1 Ответ

0 голосов
/ 18 февраля 2019

Невозможно сохранить только части пробела между элементами: либо пробел считается значимым, либо нет.

Другое решение состоит в замене всех пустых строк комментарием-заполнителем, форматдокумент обычным способом, а затем удалите комментарии (но оставив пустые строки).

Например:

public static class XmlFormatting {

    static readonly string sNewLineComment = new XComment($"x-newline-placeholder-{Guid.NewGuid()}").ToString();
    static readonly Regex sNewLineCommentRegex = new Regex($@"^\s*{sNewLineComment}\s*$", RegexOptions.Compiled | RegexOptions.Multiline);
    static readonly Regex sEmptyLineRegex = new Regex(@"^\s*$", RegexOptions.Compiled | RegexOptions.Multiline);

    public static string PrettyPrintXml(string inputXml) {
        string newlinesReplacedWithComments = sEmptyLineRegex.Replace(inputXml, sNewLineComment);
        string formattedDocument = XDocument.Parse(newlinesReplacedWithComments, LoadOptions.None).ToString();
        return sNewLineCommentRegex.Replace(formattedDocument, string.Empty);
    }
}
...