{"id":187,"date":"2011-02-07T20:38:29","date_gmt":"2011-02-07T20:38:29","guid":{"rendered":"http:\/\/www.ericwhite.com\/home2\/bm8qcmjy\/public_html\/blog\/?p=187"},"modified":"2011-02-24T22:58:16","modified_gmt":"2011-02-24T22:58:16","slug":"generating-c-code-from-an-xml-tree-using-virtual-extension-methods","status":"publish","type":"post","link":"https:\/\/www.ericwhite.com\/blog\/2011\/02\/07\/generating-c-code-from-an-xml-tree-using-virtual-extension-methods\/","title":{"rendered":"Generating C# code from an XML Tree using Virtual Extension Methods"},"content":{"rendered":"<p>One integral part of my scheme for building a document generation system is to write some code that generates C# code to create an arbitrary XML tree. I want to transform the markup for the main document part into C# code that will produce that main document part, with the exception that at various points where I find content controls, I want to alter the transformation as appropriate. The first task is to write code that produces C# code that will create any arbitrary XML tree.<\/p>\n<p>This post is the fifth in a series of blog posts. Here is the complete list: <a href=\"https:\/\/www.ericwhite.com\/blog\/map\/generating-open-xml-wordprocessingml-documents-blog-post-series\/\">Generating Open XML WordprocessingML Documents Blog Post Series<\/a><\/p>\n<p>To demonstrate what I mean by code that generates code, here is a small snippet that parses a string, creates an XML tree, and then prints the code that the XElementToCode method produces:<br \/>\n<code><br \/>\nXElement&nbsp;e&nbsp;=&nbsp;XElement.Parse(<br \/>\n@\"&lt;Root&nbsp;xmlns='http:\/\/www.ericwhite.com'&gt;<br \/>\n&nbsp;&nbsp;&lt;Child&gt;This&nbsp;is&nbsp;a&nbsp;text&nbsp;node.&lt;\/Child&gt;<br \/>\n&nbsp;&nbsp;&lt;!--Here&nbsp;is&nbsp;a&nbsp;comment.--&gt;<br \/>\n&lt;\/Root&gt;\");<br \/>\nConsole.WriteLine(\"var&nbsp;z&nbsp;=&nbsp;{0};\",&nbsp;LtxToCode.XElementToCode(e));<br \/>\n<\/code><\/p>\n<p>This produces the following automatically written code:<br \/>\n<code><br \/>\nvar&nbsp;z&nbsp;=&nbsp;new&nbsp;XElement(\"{http:\/\/www.ericwhite.com}Root\",<br \/>\n&nbsp;&nbsp;new&nbsp;XAttribute(\"xmlns\",&nbsp;@\"http:\/\/www.ericwhite.com\"),<br \/>\n&nbsp;&nbsp;new&nbsp;XElement(\"{http:\/\/www.ericwhite.com}Child\",<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;XText(@\"This&nbsp;is&nbsp;a&nbsp;text&nbsp;node.\")<br \/>\n&nbsp;&nbsp;),<br \/>\n&nbsp;&nbsp;new&nbsp;XComment(@\"Here&nbsp;is&nbsp;a&nbsp;comment.\")<br \/>\n);<br \/>\n<\/code><\/p>\n<p>The code that I present in this post uses expanded XML names, which deserve a bit of an explanation.<\/p>\n<h1>Expanded XML Names<\/h1>\n<p>In LINQ to XML, an expanded name is an approach that enables specification of a namespace and local name in a single string. The gist of it (which you can see in the example above) is that the namespace is enclosed in curly braces, followed by the local name.<\/p>\n<p>The normal idiom when working with names and namespaces in LINQ to XML is to declare and initialize an XNamespace object, and then use the overload of the \u2018+\u2019 operator to combine the namespace with a local name to create a fully qualified name:<br \/>\n<code><br \/>\nXNamespace&nbsp;ew&nbsp;=&nbsp;\"http:\/\/www.ericwhite.com\";<br \/>\nXElement&nbsp;root&nbsp;=&nbsp;new&nbsp;XElement(ew&nbsp;+&nbsp;\"Root\");<br \/>\nConsole.WriteLine(root);<br \/>\n<\/code><\/p>\n<p>This snippet is identical in functionality to the following example, which uses an expanded name:<br \/>\n<code><br \/>\nXElement root = new XElement(\"{http:\/\/www.ericwhite.com}Root\");<br \/>\nConsole.WriteLine(root);<br \/>\n<\/code><\/p>\n<p>While the second approach is perhaps marginally slower than the first approach, it is far easier to generate code that uses the second approach. If I used the first approach, I would need to setup a dictionary that maps namespace names to XNamespace object names, and then appropriately generate code that uses the correct XNamespace objects. It is a fair amount of housekeeping. So instead of using that approach, the generated code specifies fully qualified names using expanded names.<\/p>\n<p>One note about the LINQ to XML programming interface: When you call the ToString method on an XName object, the returned string is an expanded name. For instance, the following code prints the fully qualified name of an element:<br \/>\n<code><br \/>\nXElement root = XElement.Parse(\"&lt;Root xmlns='http:\/\/www.ericwhite.com'\/&gt;\");<br \/>\nConsole.WriteLine(root.Name);<br \/>\n<\/code><\/p>\n<p>This outputs the expanded name:<br \/>\n<code><br \/>\n{http:\/\/www.ericwhite.com}Root<br \/>\n<\/code><\/p>\n<h1>About the Example<\/h1>\n<p>The code in the following example uses extension methods to implement a recursive transform from the XML tree to code that will create the XML tree.\u00a0 The example contains a few sample XML documents that it converts to code.\u00a0 It produces a C# that you can compile and run \u2013 the C# code instantiates two XML trees \u2013 one using the XElement.Parse method, and another using the C# code that is generated by the example.\u00a0 The example then uses DeepEquals to validate that the two trees are identical.<\/p>\n<p>To run the example:<\/p>\n<p>Create a new C# console application<\/p>\n<p>Copy and paste the following code into Program.cs.<\/p>\n<p>Run the example.\u00a0 This produces a new file, GeneratedTestProgram.cs.\u00a0 You can examine the generated code for each XML tree in the generated program.<\/p>\n<p>Next, we want to validate that the generated code actually generates the XML tree that it should.\u00a0 Create a new C# console application, replace Program.cs in the new program with the generated program, and then run it to validate that the generated code produced the correct XML tree.<\/p>\n<p>This example simulates the use of virtual extension methods, which made the example very easy to write.\u00a0 In the next post, I\u2019ll explain virtual extension methods.<br \/>\n<code><br \/>\nusing&nbsp;System;<br \/>\nusing&nbsp;System.Collections.Generic;<br \/>\nusing&nbsp;System.IO;<br \/>\nusing&nbsp;System.Linq;<br \/>\nusing&nbsp;System.Text;<br \/>\nusing&nbsp;System.Xml.Linq;<\/p>\n<p>public&nbsp;static&nbsp;class&nbsp;LocalExtensions<br \/>\n{<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;string&nbsp;StringConcatenate(this&nbsp;IEnumerable&lt;string&gt;&nbsp;source)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;{<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder&nbsp;sb&nbsp;=&nbsp;new&nbsp;StringBuilder();<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(string&nbsp;item&nbsp;in&nbsp;source)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Append(item);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;sb.ToString();<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;}<br \/>\n}<\/p>\n<p>public&nbsp;static&nbsp;class&nbsp;LtxToCode<br \/>\n{<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;XNamespace&nbsp;w&nbsp;=&nbsp;\"http:\/\/schemas.openxmlformats.org\/wordprocessingml\/2006\/main\";<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;XNamespace&nbsp;ew&nbsp;=&nbsp;\"http:\/\/www.ericwhite.com\/xmlcodegeneration\";<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;string&nbsp;Indentation(XObject&nbsp;xObject)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;{<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XAttribute&nbsp;attribute&nbsp;=&nbsp;xObject&nbsp;as&nbsp;XAttribute;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(attribute&nbsp;!=&nbsp;null)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;\"\".PadRight((attribute.Parent.Ancestors().Count()&nbsp;+&nbsp;1&nbsp;+<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(attribute.Parent.Document&nbsp;!=&nbsp;null&nbsp;?&nbsp;1&nbsp;:&nbsp;0))&nbsp;*&nbsp;2,&nbsp;'&nbsp;');<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XElement&nbsp;element&nbsp;=&nbsp;xObject&nbsp;as&nbsp;XElement;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(element&nbsp;!=&nbsp;null)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;\"\".PadRight((element.Ancestors().Count()&nbsp;+<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(element.Document&nbsp;!=&nbsp;null&nbsp;?&nbsp;1&nbsp;:&nbsp;0))&nbsp;*&nbsp;2,&nbsp;'&nbsp;');<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XDocument&nbsp;document&nbsp;=&nbsp;xObject&nbsp;as&nbsp;XDocument;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(document&nbsp;!=&nbsp;null)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;\"\";<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XProcessingInstruction&nbsp;pi&nbsp;=&nbsp;xObject&nbsp;as&nbsp;XProcessingInstruction;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(pi&nbsp;!=&nbsp;null)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;\"\".PadRight((pi.Ancestors().Count()&nbsp;+<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(pi.Document&nbsp;!=&nbsp;null&nbsp;?&nbsp;1&nbsp;:&nbsp;0))&nbsp;*&nbsp;2,&nbsp;'&nbsp;');<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XNode&nbsp;node&nbsp;=&nbsp;xObject&nbsp;as&nbsp;XNode;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(node&nbsp;!=&nbsp;null)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(node.Parent&nbsp;!=&nbsp;null)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;\"\".PadRight((node.Parent.Ancestors().Count()&nbsp;+<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;+&nbsp;(node.Document&nbsp;!=&nbsp;null&nbsp;?&nbsp;1&nbsp;:&nbsp;0))&nbsp;*&nbsp;2,&nbsp;'&nbsp;');<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;\"\";<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;CodeGenerationException(\"Internal&nbsp;error\");<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;}<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;string&nbsp;ToCode(this&nbsp;XObject&nbsp;xObject)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;{<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XAttribute&nbsp;a&nbsp;=&nbsp;xObject&nbsp;as&nbsp;XAttribute;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(a&nbsp;!=&nbsp;null)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;a.ToCode();<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XElement&nbsp;element&nbsp;=&nbsp;xObject&nbsp;as&nbsp;XElement;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(element&nbsp;!=&nbsp;null)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;element.ToCode();<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XCData&nbsp;cdata&nbsp;=&nbsp;xObject&nbsp;as&nbsp;XCData;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(cdata&nbsp;!=&nbsp;null)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;cdata.ToCode();<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XText&nbsp;text&nbsp;=&nbsp;xObject&nbsp;as&nbsp;XText;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(text&nbsp;!=&nbsp;null)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;text.ToCode();<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XComment&nbsp;comment&nbsp;=&nbsp;xObject&nbsp;as&nbsp;XComment;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(comment&nbsp;!=&nbsp;null)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;comment.ToCode();<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XProcessingInstruction&nbsp;pi&nbsp;=&nbsp;xObject&nbsp;as&nbsp;XProcessingInstruction;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(pi&nbsp;!=&nbsp;null)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;pi.ToCode();<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;CodeGenerationException(\"Internal&nbsp;error\");<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;}<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;string&nbsp;ToCode(this&nbsp;XDocument&nbsp;document)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;{<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;s&nbsp;=&nbsp;\"new&nbsp;XDocument(\"&nbsp;+&nbsp;Environment.NewLine&nbsp;+<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(document.Declaration&nbsp;!=&nbsp;null&nbsp;?<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String.Format(\"&nbsp;&nbsp;new&nbsp;XDeclaration(\\\"{0}\\\",&nbsp;\\\"{1}\\\",&nbsp;\\\"{2}\\\"),\"&nbsp;+<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Environment.NewLine,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.Declaration.Version,&nbsp;document.Declaration.Encoding,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.Declaration.Standalone)&nbsp;:<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"\")&nbsp;+<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TrimFinalComma(document<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Nodes().Select(n&nbsp;=&gt;&nbsp;n.ToCode()).StringConcatenate())&nbsp;+<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\")\";<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;s;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;}<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;string&nbsp;ToCode(this&nbsp;XElement&nbsp;element)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;{<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;c&nbsp;=&nbsp;element<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Attributes()<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Cast&lt;XObject&gt;()<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Concat(element.Nodes().Cast&lt;XObject&gt;());<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(element.Name&nbsp;==&nbsp;ew&nbsp;+&nbsp;\"Literal\")<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;element.Value;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(c.Count()&nbsp;==&nbsp;0)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Indentation(element)&nbsp;+<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String.Format(\"new&nbsp;XElement(\\\"{0}\\\"),\"&nbsp;+&nbsp;Environment.NewLine,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;element.Name);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Indentation(element)&nbsp;+<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String.Format(\"new&nbsp;XElement(\\\"{0}\\\",\"&nbsp;+&nbsp;Environment.NewLine,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;element.Name)&nbsp;+<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TrimFinalComma(c.Select(n&nbsp;=&gt;&nbsp;n.ToCode()).StringConcatenate())&nbsp;+<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Indentation(element)&nbsp;+&nbsp;\"),\"&nbsp;+&nbsp;Environment.NewLine;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;}<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;string&nbsp;ToCode(this&nbsp;XAttribute&nbsp;attribute)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;{<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Indentation(attribute)&nbsp;+<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String.Format(\"new&nbsp;XAttribute(\\\"{0}\\\",&nbsp;@\\\"{1}\\\"),\"&nbsp;+&nbsp;Environment.NewLine,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;attribute.Name,&nbsp;attribute.Value.Replace(\"\\\"\",&nbsp;\"\\\"\\\"\"));<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;}<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;string&nbsp;ToCode(this&nbsp;XText&nbsp;text)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;{<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Indentation(text)&nbsp;+<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String.Format(\"new&nbsp;XText(@\\\"{0}\\\"),\"&nbsp;+&nbsp;Environment.NewLine,&nbsp;text.Value.Replace(\"\\\"\",&nbsp;\"\\\"\\\"\"));<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;}<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;string&nbsp;ToCode(this&nbsp;XComment&nbsp;comment)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;{<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Indentation(comment)&nbsp;+<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String.Format(\"new&nbsp;XComment(@\\\"{0}\\\"),\"&nbsp;+&nbsp;Environment.NewLine,&nbsp;comment.Value.Replace(\"\\\"\",&nbsp;\"\\\"\\\"\"));<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;}<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;string&nbsp;ToCode(this&nbsp;XProcessingInstruction&nbsp;pi)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;{<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Indentation(pi)&nbsp;+<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String.Format(\"new&nbsp;XProcessingInstruction(@\\\"{0}\\\",&nbsp;@\\\"{1}\\\"),\"&nbsp;+<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Environment.NewLine,&nbsp;pi.Target.Replace(\"\\\"\",&nbsp;\"\\\"\\\"\"),&nbsp;pi.Data.Replace(\"\\\"\",&nbsp;\"\\\"\\\"\"));<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;}<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;string&nbsp;ToCode(this&nbsp;XCData&nbsp;cdata)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;{<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Indentation(cdata)&nbsp;+<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String.Format(\"new&nbsp;XCData(@\\\"{0}\\\"),\"&nbsp;+&nbsp;Environment.NewLine,&nbsp;cdata.Value.Replace(\"\\\"\",&nbsp;\"\\\"\\\"\"));<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;}<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;string&nbsp;TrimFinalComma(string&nbsp;code)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;{<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(code.EndsWith(\",\"&nbsp;+&nbsp;Environment.NewLine))<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;code.Substring(0,&nbsp;code.Length&nbsp;-&nbsp;(\",\"&nbsp;+&nbsp;Environment.NewLine).Length)&nbsp;+<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Environment.NewLine;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;code;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;}<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;string&nbsp;XElementToCode(XElement&nbsp;element)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;{<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;code&nbsp;=&nbsp;element.ToCode();<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(code.EndsWith(\",\"&nbsp;+&nbsp;Environment.NewLine))<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;code.Substring(0,&nbsp;code.Length&nbsp;-&nbsp;(\",\"&nbsp;+&nbsp;Environment.NewLine).Length);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;code;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;}<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;string&nbsp;XDocumentToCode(XDocument&nbsp;document)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;{<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;code&nbsp;=&nbsp;document.ToCode();<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(code.EndsWith(\",\"&nbsp;+&nbsp;Environment.NewLine))<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;code.Substring(0,&nbsp;code.Length&nbsp;-&nbsp;(\",\"&nbsp;+&nbsp;Environment.NewLine).Length);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;code;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;}<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;class&nbsp;CodeGenerationException&nbsp;:&nbsp;Exception<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;{<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;CodeGenerationException(string&nbsp;message)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;base(message)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;}<br \/>\n}<\/p>\n<p>public&nbsp;class&nbsp;GenerateDocumentException&nbsp;:&nbsp;Exception<br \/>\n{<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;GenerateDocumentException(string&nbsp;message)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;base(message)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;{<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;}<br \/>\n}<\/p>\n<p>class&nbsp;Program<br \/>\n{<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;string[]&nbsp;testXml&nbsp;=&nbsp;new[]&nbsp;{<br \/>\n@\"&lt;Root&nbsp;a=\"\"1\"\"&nbsp;b=\"\"2\"\"\/&gt;\",<\/p>\n<p>@\"&lt;?xml&nbsp;version=\"\"1.0\"\"&nbsp;encoding=\"\"UTF-8\"\"&nbsp;standalone=\"\"yes\"\"?&gt;<br \/>\n&lt;Root&gt;<br \/>\n&nbsp;&nbsp;&lt;Child&gt;&nbsp;abc&nbsp;&lt;\/Child&gt;<br \/>\n&nbsp;&nbsp;&lt;Child&nbsp;xmlns:space=\"\"preserve\"\"&gt;&nbsp;abc&nbsp;&lt;\/Child&gt;<br \/>\n&lt;\/Root&gt;\",<\/p>\n<p>@\"&lt;?xml&nbsp;version=\"\"1.0\"\"&nbsp;encoding=\"\"UTF-8\"\"&nbsp;standalone=\"\"yes\"\"?&gt;<br \/>\n&lt;Root&gt;&lt;![CDATA[foo]]&gt;&lt;\/Root&gt;\",<\/p>\n<p>@\"&lt;?xml&nbsp;version=\"\"1.0\"\"&nbsp;encoding=\"\"UTF-8\"\"&nbsp;standalone=\"\"yes\"\"?&gt;<br \/>\n&lt;Root&gt;&lt;Child\/&gt;&lt;\/Root&gt;\",<\/p>\n<p>@\"&lt;?xml&nbsp;version=\"\"1.0\"\"&nbsp;encoding=\"\"UTF-8\"\"&nbsp;standalone=\"\"yes\"\"?&gt;<br \/>\n&lt;Root\/&gt;\",<\/p>\n<p>@\"&lt;Root&nbsp;xmlns=\"\"http:\/\/www.ericwhite.com\/aaaaa\"\"&gt;<br \/>\n&nbsp;&nbsp;&lt;Child&nbsp;xmlns=\"\"http:\/\/www.ericwhite.com\/child\"\"&gt;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;Element&nbsp;att=\"\"1\"\"<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b:att2=\"\"2\"\"<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:b=\"\"http:\/\/www.ericwhite.com\/bbbbb\"\"&gt;abc&lt;\/Element&gt;<br \/>\n&nbsp;&nbsp;&lt;\/Child&gt;<br \/>\n&lt;\/Root&gt;\",<\/p>\n<p>@\"&lt;a:Root&nbsp;xmlns:a=\"\"http:\/\/www.ericwhite.com\"\"&gt;abc&lt;\/a:Root&gt;\",<\/p>\n<p>@\"&lt;a:Root&nbsp;xmlns:a=\"\"http:\/\/www.ericwhite.com\"\"&gt;abc&lt;!--a&nbsp;comment&nbsp;--&gt;def&lt;\/a:Root&gt;\",<\/p>\n<p>@\"&lt;Root&gt;abc&lt;\/Root&gt;\",<\/p>\n<p>@\"&lt;Root&nbsp;att1=\"\"1\"\"&nbsp;att2=\"\"2\"\"\/&gt;\",<\/p>\n<p>@\"&lt;Root\/&gt;\",<\/p>\n<p>@\"&lt;Root&nbsp;att1=\"\"1\"\"&gt;<br \/>\n&nbsp;&nbsp;&lt;Child&gt;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;Gc1&gt;abc&lt;b\/&gt;def&lt;\/Gc1&gt;<br \/>\n&nbsp;&nbsp;&lt;\/Child&gt;<br \/>\n&nbsp;&nbsp;&lt;Child&gt;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;Gc2&gt;abc&lt;\/Gc2&gt;<br \/>\n&nbsp;&nbsp;&lt;\/Child&gt;<br \/>\n&lt;\/Root&gt;\",<\/p>\n<p>@\"&lt;?xml&nbsp;version=\"\"1.0\"\"&nbsp;encoding=\"\"UTF-8\"\"&nbsp;standalone=\"\"yes\"\"?&gt;<\/p>\n<p>&lt;?mso-application&nbsp;progid=\"\"Word.Document\"\"?&gt;<\/p>\n<p>&lt;!--This&nbsp;is&nbsp;a&nbsp;comment&nbsp;at&nbsp;the&nbsp;root&nbsp;level.&nbsp;&nbsp;There&nbsp;are&nbsp;also&nbsp;white&nbsp;space&nbsp;nodes&nbsp;at&nbsp;the&nbsp;root&nbsp;level.--&gt;<\/p>\n<p>&lt;pkg:package&nbsp;xmlns:pkg=\"\"http:\/\/schemas.microsoft.com\/office\/2006\/xmlPackage\"\"&gt;<br \/>\n&nbsp;&nbsp;&lt;pkg:part&nbsp;pkg:name=\"\"\/_rels\/.rels\"\"<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pkg:contentType=\"\"application\/vnd.openxmlformats-package.relationships+xml\"\"<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pkg:padding=\"\"512\"\"&gt;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;pkg:xmlData&gt;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Relationships<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns=\"\"http:\/\/schemas.openxmlformats.org\/package\/2006\/relationships\"\"&gt;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Relationship&nbsp;Id=\"\"rId3\"\"<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type=\"\"http:\/\/schemas.openxmlformats.org\"\"<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Target=\"\"docProps\/app.xml\"\"\/&gt;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Relationship&nbsp;Id=\"\"rId2\"\"<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type=\"\"http:\/\/schemas.openxmlformats.org\"\"<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Target=\"\"docProps\/core.xml\"\"\/&gt;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Relationship&nbsp;Id=\"\"rId1\"\"<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type=\"\"http:\/\/schemas.openxmlformats.org\"\"<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Target=\"\"word\/document.xml\"\"\/&gt;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;\/Relationships&gt;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;\/pkg:xmlData&gt;<br \/>\n&nbsp;&nbsp;&lt;\/pkg:part&gt;<br \/>\n&lt;\/pkg:package&gt;\",<br \/>\n};<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;void&nbsp;Main(string[]&nbsp;args)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;{<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;st1&nbsp;=&nbsp;(@\"using&nbsp;System;<br \/>\nusing&nbsp;System.Collections.Generic;<br \/>\nusing&nbsp;System.Linq;<br \/>\nusing&nbsp;System.Text;<br \/>\nusing&nbsp;System.Xml.Linq;<\/p>\n<p>namespace&nbsp;ConsoleApplication1<br \/>\n{<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;Program<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;{<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;void&nbsp;Main(string[]&nbsp;args)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br \/>\n\");<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder&nbsp;sb&nbsp;=&nbsp;new&nbsp;StringBuilder();<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;test&nbsp;as&nbsp;XElement<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;testXml.Length;&nbsp;i++)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Append(<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String.Format(\"var&nbsp;xElementSourceTree{0}&nbsp;=&nbsp;XElement.Parse(@\\\"{1}\\\");\",<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i,&nbsp;testXml[i].Replace(\"\\\"\",&nbsp;\"\\\"\\\"\")));<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Append(Environment.NewLine);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Append(String.Format(\"var&nbsp;xElementCodeTree{0}&nbsp;=&nbsp;{1};\",<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i,&nbsp;LtxToCode.XElementToCode(XElement.Parse(testXml[i]))));<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Append(Environment.NewLine);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Append(String.Format(<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"if&nbsp;(XNode.DeepEquals(xElementSourceTree{0},&nbsp;xElementCodeTree{0}))\",&nbsp;i));<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Append(Environment.NewLine);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Append(String.Format(<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(\\\"XElement&nbsp;Test&nbsp;{0}&nbsp;Passed\\\");\",&nbsp;i));<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Append(Environment.NewLine);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Append(\"else\");<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Append(Environment.NewLine);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Append(String.Format(<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(\\\"XElement&nbsp;Test&nbsp;{0}&nbsp;Failed\\\");\",&nbsp;i));<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Append(Environment.NewLine);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Append(Environment.NewLine);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;test&nbsp;as&nbsp;XDocument<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;testXml.Length;&nbsp;i++)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Append(String.Format(<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"var&nbsp;xDocumentSourceTree{0}&nbsp;=&nbsp;XDocument.Parse(@\\\"{1}\\\");\",<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i,&nbsp;testXml[i].Replace(\"\\\"\",&nbsp;\"\\\"\\\"\")));<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Append(Environment.NewLine);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Append(String.Format(\"var&nbsp;xDocumentCodeTree{0}&nbsp;=&nbsp;{1};\",<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i,&nbsp;LtxToCode.XDocumentToCode(XDocument.Parse(testXml[i]))));<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Append(Environment.NewLine);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Append(String.Format(<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"if&nbsp;(XNode.DeepEquals(xDocumentSourceTree{0},&nbsp;xDocumentCodeTree{0}))\",&nbsp;i));<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Append(Environment.NewLine);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Append(String.Format(<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(\\\"XDocument&nbsp;Test&nbsp;{0}&nbsp;Passed\\\");\",&nbsp;i));<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Append(Environment.NewLine);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Append(\"else\");<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Append(Environment.NewLine);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Append(String.Format(<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(\\\"XDocument&nbsp;Test&nbsp;{0}&nbsp;Failed\\\");\",&nbsp;i));<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Append(Environment.NewLine);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.Append(Environment.NewLine);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;st2&nbsp;=&nbsp;@\"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;}<br \/>\n}\";<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;fullProgram&nbsp;=&nbsp;st1&nbsp;+&nbsp;sb.ToString()&nbsp;+&nbsp;st2;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File.WriteAllText(\"GeneratedTestProgram.cs\",&nbsp;fullProgram);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;}<br \/>\n}<br \/>\n<\/code><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Presents code that generates C# code to create an arbitrary XML document.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_bbp_topic_count":0,"_bbp_reply_count":0,"_bbp_total_topic_count":0,"_bbp_total_reply_count":0,"_bbp_voice_count":0,"_bbp_anonymous_reply_count":0,"_bbp_topic_count_hidden":0,"_bbp_reply_count_hidden":0,"_bbp_forum_subforum_count":0,"_s2mail":"","footnotes":""},"categories":[7,3,5],"tags":[],"class_list":["post-187","post","type-post","status-publish","format-standard","hentry","category-document-generation-series","category-open-xml","category-wordprocessingml"],"_links":{"self":[{"href":"https:\/\/www.ericwhite.com\/blog\/wp-json\/wp\/v2\/posts\/187","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ericwhite.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ericwhite.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ericwhite.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ericwhite.com\/blog\/wp-json\/wp\/v2\/comments?post=187"}],"version-history":[{"count":26,"href":"https:\/\/www.ericwhite.com\/blog\/wp-json\/wp\/v2\/posts\/187\/revisions"}],"predecessor-version":[{"id":256,"href":"https:\/\/www.ericwhite.com\/blog\/wp-json\/wp\/v2\/posts\/187\/revisions\/256"}],"wp:attachment":[{"href":"https:\/\/www.ericwhite.com\/blog\/wp-json\/wp\/v2\/media?parent=187"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ericwhite.com\/blog\/wp-json\/wp\/v2\/categories?post=187"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ericwhite.com\/blog\/wp-json\/wp\/v2\/tags?post=187"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}