【问题标题】:Generate XmlWriter c# code from XML从 XML 生成 XmlWriter c# 代码
【发布时间】:2012-04-05 08:38:12
【问题描述】:

我有一个需要使用 XmlWriter 在代码中创建的 XML 文件。是否有任何代码生成器可以获取 XML 并生成 c# 代码行以使用 XmlWriter 重新创建它?

【问题讨论】:

  • 为什么要使用 XmlWriter?使用 LINQ to XML 要简单得多。而且,不,我从未听说过这样的工具。

标签: c# xml xmlwriter


【解决方案1】:

你可以自己写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;
    }

}
#>

【讨论】:

  • 这几乎工作得很好,只是它只返回 xml 文件的第一个节点。你知道如何遍历 xml 文件中的所有节点吗?
  • 我想出了我需要更改的内容并在下面发布了代码。非常感谢你给我这个方向。这非常有帮助!
【解决方案2】:

我接受了 Anurag 的回复,对其进行了修改,这对我有用:

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

#>

【讨论】:

    【解决方案3】:

    Visual Studio 的 Xsd.exe 可能会对您有所帮助

    【讨论】:

      猜你喜欢
      • 2016-12-09
      • 1970-01-01
      • 1970-01-01
      • 2011-03-13
      • 1970-01-01
      • 2013-11-05
      • 1970-01-01
      • 1970-01-01
      • 2012-03-04
      相关资源
      最近更新 更多