2012-04-03 8 views
0

XmlWriterを使用してコードで作成する必要があるXMLファイルがあります。 XMLを受け取り、XmlWriterを使用してC#コードの行を生成するコードジェネレータはありますか?XMLからXmlWriter c#コードを生成する

+0

なぜXmlWriterを使用するのですか? XMLへのLINQの使用ははるかに簡単です。そして、いいえ、私はそのようなツールについて聞いたことがありません。 –

答えて

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

私はあなたのために働いてうれしい –

0

のVisual StudioのXsd.exeではあなたに

+0

これはクラスを作成しますが、ストレートフォワードXmlWriterコードではありません – user31673

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

+0

私は変更が必要なことを理解し、以下のコードを投稿しました。私にこの方向を教えてくれてありがとう。それは非常に有用でした! – user31673

関連する問題