Tribal Knowledge: C# XDocument Copy Xml But Remove the Pesky DocType
In another of my series of Tribal Knowledge articles, this one discusses the basics of loading an XDocument and creating a different document from that original.
There may be a need for one to remove the document type from the original XDocument in C#, or do a basic copy and this is presented here.
How-To
Here is the Xml in a classic before:
<?xml version='1.0' encoding='utf-8'?> <!-- Generator: AVG Magician 1.0.0, AVG Exports Plug-In . AVG Version: 2.00 Build 8675309) --> <!DOCTYPE svg PUBLIC '-//W3C//DTD AVG 1.1//EN' 'http://www.w3.org/Graphics/AVG/1.1/DTD/avg11.dtd'[]> <avg version='1.1' id='Layer_1' x='0px' y='0px' xml:space='preserve'> <rect x='100.143' y='103.714' fill='none' width='87.857' height='12.143' /> </avg>
and this is what we want to achieve:
<?xml version='1.0' encoding='utf-8'?> <avg version="1.1" id="Layer_1" x="0px" y="0px" xml:space="preserve"> <rect x="100.143" y="103.714" fill="none" width="87.857" height="12.143" /> </avg>
Since we only care about the AVG node, its the main root, we will simply get that node and append it to our new clone. Here is the full code:
string xml = @"<?xml version='1.0' encoding='utf-8'?> <!-- Generator: AVG Magician 1.0.0, AVG Export Plug-In . AVG Version: 2.00 Build 8675309) --> <!DOCTYPE svg PUBLIC '-//W3C//DTD AVG 1.1//EN' 'http://www.w3.org/Graphics/AVG/1.1/DTD/avg11.dtd'[]> <avg version='1.1' id='Layer_1' x='0px' y='0px' xml:space='preserve'> <rect x='100.143' y='103.714' fill='none' width='87.857' height='12.143' /> </avg>"; XDocument loaded = XDocument.Parse( xml, LoadOptions.SetLineInfo ); XDocument clone = new XDocument( new XDeclaration( "1.0", "utf-8", "yes"), loaded.LastNode ); Console.WriteLine( clone );
The above achieves the after Xml which we seek, no DocType, we didn’t add it and no first node which is the comment line. I hope this little example helps.