2012-04-03 81 views
0

我有一個XML文件,需要使用XmlWriter在代碼中創建。是否有任何代碼生成器會採用XML並生成c#代碼行以使用XmlWriter重新創建它?從XML生成XmlWriter c#代碼

+0

爲什麼使用XmlWriter?使用LINQ to XML更簡單。不,我從來沒有聽說過這樣的工具。 – 2012-04-03 22:36:06

回答

1

我把阿努拉格的反應,修改了它,這裏是什麼在爲我工作:

<#@ 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; 
    } 
} 

#> 
+0

我很高興它爲你工作 – 2012-04-05 02:24:50

0

Visual Studio的XSD.EXE可以幫助你

+0

創建類但不是直接的XmlWriter代碼 – user31673 2012-04-03 21:00:50

2

您可以編寫自己的T4 Template

下面是一些代碼,讓你開始:

<#@ 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 Test 
{ 
    public class TestClass 
    { 
    #region Methods 

     public static void WriteXml() 
     { 

    using(var writer = XmlWriter.Create("out.xml")) 
    { 
<# 
    foreach (XmlNode node in this.GetNames()) 
{ 
    if(node.NodeType == XmlNodeType.Element) { 
#> 
     writer.WriteStartElement(@"<#= node.Name #>"); 
<# } 
if(node.NodeType == XmlNodeType.Comment) { 
#> 
    writer.WriteComment(@"<#= node.Value #>"); 
<# } 
} 
#> 
    } 
    } 

    #endregion 
} 
} 
<#+ 

public IEnumerable<XmlNode> GetNames() 
{ 
    List<string> result = new List<string>(); 
    XmlDocument doc = new XmlDocument();   
    string absolutePath = @"c:\data\XMLFile1.xml";     
    doc.Load(absolutePath); 
    foreach (XmlNode node in doc.ChildNodes) 
    { 
     yield return node; 
    } 

} 
#> 
+0

這幾乎工作得很好,只是它只返回xml文件的第一個節點。你知道我如何遍歷XML文件中的所有節點嗎? – user31673 2012-04-04 22:54:30

+0

我想出了我需要更改併發佈下面的代碼。非常感謝你給我這個方向。這是非常有幫助的! – user31673 2012-04-05 00:39:12