Search code examples
c#xmlxmlwriter

Generate XmlWriter c# code from XML


I have an XML file that I need to create in code using XmlWriter. Is there any code generator that will take the XML and generate the lines of c# code to recreate it using XmlWriter?


Solution

  • I took Anurag's response, modified it, and here is what is working for me:

    <#@ template language="C#" #> 
    <#@ assembly name="System.Core" #> 
    <#@ assembly name="System.Xml" #> 
    <#@ import namespace="System.Xml" #> 
    <#@ import namespace="System.Collections.Generic" #> 
    <#@ import namespace="System.IO" #> 
    using System; 
    using System.Text; 
    using System.Xml; 
    
     namespace AutoGenerateXmlWriteCode 
     { 
        public class TestClass 
       { 
        #region Methods 
    
            public static void WriteXml() 
            { 
                XmlWriterSettings settings = new XmlWriterSettings();
                settings.Indent = true;
                settings.IndentChars = "\t";
                settings.OmitXmlDeclaration = true;
    
                using( var writer = XmlWriter.Create("out.xml", settings)) 
            { 
    <# 
      foreach (XmlReader node in this.GetNames())    
        { 
            if(node.NodeType == XmlNodeType.Element) { 
    #> 
                writer.WriteStartElement(@"<#= node.Name  #>"); // <#= node.Name  #> 
    <#
                if (node.HasAttributes)
                {
                    node.MoveToFirstAttribute();
    #> 
                        writer.WriteAttributeString(@"<#= node.Name  #>", @"<#= node.Value  #>");
     <#
                    while (node.MoveToNextAttribute())
                    {
     #> 
                        writer.WriteAttributeString(@"<#= node.Name  #>", @"<#= node.Value  #>");
     <#
                   }
                    node.MoveToElement();
                }
    
                if (node.IsEmptyElement){
    #>
    
                writer.WriteEndElement(); // <#= node.Name  #> 
    <#
                }
            } 
            if(node.NodeType == XmlNodeType.Text) { 
    #> 
                writer.WriteValue(@"<#= node.Value  #>");
    <#      } 
            if(node.NodeType == XmlNodeType.EndElement) { 
    #> 
                writer.WriteEndElement();  // <#= node.Name  #>
    <#      } 
    } 
    #> 
        } 
      } 
    
        #endregion 
     } 
    } 
    
    <#+ 
    
     public IEnumerable<XmlReader> GetNames() 
     { 
        List<string> result = new List<string>();  
        string absolutePath = @"d:\MyFile.xml";                 
        XmlReader rdr = XmlReader.Create(absolutePath);
        while (rdr.Read())
        {
            yield return rdr;
        }
    } 
    
    #>