带自定义格式的XML编写器

Dmi*_*tsa 3 c# xml formatting

我需要创建一个人类可读的XML文件.XmlWriter似乎对此几乎是完美的,但我想插入换行符,或者一般来说,我想要它们的自定义空格.WriteRawWriteWhitespace似乎都不能在元素中的属性之间起作用.后者看起来应该工作(此方法用于手动格式化您的文档),但抛出InvalidOperationException(状态元素内容中的Token StartAttribute将导致无效的XML文档),如果用于代替下面的注释.

是否有XmlWriter或支持此功能的第三方XML库的解决方法?

示例代码(LINQPad语句就绪):

var sb = new StringBuilder();
var settings = new XmlWriterSettings {
    OmitXmlDeclaration = true,
    Indent = true,
    IndentChars = "  ",
};
using (var writer = XmlWriter.Create(sb, settings)) {
    writer.WriteStartElement("X");
    writer.WriteAttributeString("A", "1");
    // write line break
    writer.WriteAttributeString("B", "2");
    // write line break
    writer.WriteAttributeString("C", "3");
    writer.WriteEndElement();
}
Console.WriteLine(sb.ToString());
Run Code Online (Sandbox Code Playgroud)

实际结果:

<X A="1" B="2" C="3" />
Run Code Online (Sandbox Code Playgroud)

期望的结果(B和C可能不与A对齐 - 那很好,/>可以留在C上的线上):

<X A="1"
   B="2"
   C="3"
/>
Run Code Online (Sandbox Code Playgroud)

Ond*_*dar 5

你仍然有后台StringBuilder - 使用它.:

  var sb = new StringBuilder();
  var settings = new XmlWriterSettings {
    OmitXmlDeclaration = true,
    Indent = true,
    IndentChars = "  ",
  };
  using (var writer = XmlWriter.Create(sb, settings)) {
    writer.WriteStartElement("X");
    writer.WriteAttributeString("A", "1");
    writer.Flush();
    sb.Append("\r\n");
    writer.WriteAttributeString("B", "2");
    writer.Flush();
    sb.Append("\r\n");
    writer.WriteAttributeString("C", "3");
    writer.WriteEndElement();
  }
  Console.WriteLine(sb.ToString());
Run Code Online (Sandbox Code Playgroud)