xdocument save preserve white space inside tags

2019-02-17 05:40发布

问题:

I am using XDocument in LINQ to edit (insert) and save xml document.

XDocument doc = XDocument.Load("c:\\sample.xml", LoadOptions.PreserveWhitespace);
doc.Save("c:\\sample.xml",SaveOptions.DisableFormatting)

sample.xml before doc.Save :

<ELEMENT ATTRIB1="attrib1"  ATTRIB2="attrib2" >
    value
</ELEMENT>

sample.xml after doc.Save

<ELEMENT ATTRIB1="attrib1" ATTRIB2="attrib2">
    value
</ELEMENT>

As you can see, there is double space after ATTRIB1 and a single space after ATTRIB2 in the original document. But these spaces have been removed by linq when I call doc.save.

How can I preserve the whitespaces inside tag?

回答1:

I believe that LoadOptions.PreserveWhitespace and SaveOptions.DisableFormatting only instruct XDocument on how to handle whitespace in terms of indentation and the content of text nodes. It would still normalize the attributes, etc.

You may wish to use an overload where you specify an XmlWriter that is configured to do what you want, and if you can't find a configuration that works with the default XmlTextWriter, you could always create your own XmlWriter.



回答2:

These are "not significant whitespaces" and are removed at the moment of reading the XML. By the time you call save there is no information about spacing between attributes. (Note that strictly speaking even order of attributes may not be known as it has no significance in XML).

If you want to read/write XML in a way that is not directly supported by XML standard you need to provide some custom handling. Depending on requirements custom XmlWriter may be enough (i.e. if you want uniformly separate attributes with 2 whitespaces) or you'll need to build whole stack (readers/writers/nodes) yourself if you want to actually preserve information from original XML (treating it as text, not XML).