Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

XMLDocument.Save adds return carriages to XML when elements are blank

Tags:

c#

.net

xml

I'm loading a XML Document that has some tags that have no innertext.

If I populate the innertext with some data then it works as needed (you get opening tag, innertext and closing tag all on one line) like the following...

<root>
  <element>value</element>
</root>

The problem arises with tags with no values. These SHOULD be displayed in the same way as above with the exception of no value of coarse, like the following...

<root>
  <element></element>
</root>

However, when the innertext has an empty string it adds a carriage return & line feed which is not what is expected! It ends up looking like the following...

<root>
  <element>
  </element>
</root>

This is my current code that yields the above results...

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(@"C:\test.xml");

//Save the xml and then cleanup
xmlDoc.Save(@"C:\test.xml");
like image 827
Arvo Bowen Avatar asked Oct 08 '13 21:10

Arvo Bowen


3 Answers

This fixed it for me...

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(@"C:\test.xml");

//Save the xml and then cleanup
XmlWriterSettings settings = new XmlWriterSettings { Indent = true };
XmlWriter writer = XmlWriter.Create(@"C:\test.xml", settings);
xmlDoc.Save(writer);
like image 119
Arvo Bowen Avatar answered Sep 24 '22 15:09

Arvo Bowen


You control that through the XMLWriter within the Settings Property.

Check out this example along with the following references. http://msdn.microsoft.com/en-us/library/ms162618.aspx

Refernces http://msdn.microsoft.com/en-us/library/system.xml.xmlwriter.aspx http://msdn.microsoft.com/en-us/library/system.xml.xmlwritersettings.aspx http://msdn.microsoft.com/en-us/library/system.xml.xmlwritersettings.newlinehandling.aspx

like image 24
jcwrequests Avatar answered Sep 23 '22 15:09

jcwrequests


Probably too late, but I referred to the solution given by Arvo Bowen. Arvo's solution is in C#, I wrote the same in Powershell Syntax

# $dest_file is the path to the destination file
$xml_dest = [XML] (Get-Content $dest_file)

#
#   Operations done on $xml_dest
#

$settings = new-object System.Xml.XmlWriterSettings
$settings.CloseOutput = $true
$settings.Indent = $true
$writer = [System.Xml.XmlWriter]::Create($dest_file, $settings)

$xml_dest.Save($writer)
$writer.Close()

It solved my two problems:

  • One, problem stated above i.e. newline character being added to null/empty values.
  • Second, no end tag being created for null/empty values. ex: <tag1>$null</tag1> would actually be written in file as <tag /> Refer this thread: Can we force XmlWriter to issue <my-tag></my-tag> rather than <my-tag/>?
like image 39
Suveer Jacob Avatar answered Sep 25 '22 15:09

Suveer Jacob