Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

XML writer with custom formatting

Tags:

c#

formatting

xml

I need to create a human-readable XML file. XmlWriter seems to be almost perfect for this, but I'd like to insert line breaks or, in general, custom whitespace where I want them. Neither WriteRaw nor WriteWhitespace seem to work between the attributes in an element. The latter looks like it should work (This method is used to manually format your document), but throws InvalidOperationException (Token StartAttribute in state Element Content would result in an invalid XML document) if used in place of the comments below.

Is there a workaround for XmlWriter or a third-party XML library that supports this?

Example code (LINQPad-statements ready):

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

Actual result:

<X A="1" B="2" C="3" />

Desired result (B and C may be not aligned with A - that's fine, /> can be left on the line with C):

<X A="1"
   B="2"
   C="3"
/>
like image 790
Dmitry Polyanitsa Avatar asked Jan 28 '26 07:01

Dmitry Polyanitsa


1 Answers

You still has the background StringBuilder - use it. :

  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());
like image 88
Ondrej Svejdar Avatar answered Jan 29 '26 20:01

Ondrej Svejdar