У меня есть файл XML, который мне нужно создать в коде с помощью XmlWriter. Есть ли какой-нибудь генератор кода, который возьмет XML и сгенерирует строки кода С#, чтобы воссоздать его с помощью XmlWriter?
Сгенерировать код C# XmlWriter из XML
comment
Зачем использовать XmlWriter? Гораздо проще использовать LINQ to XML. И нет, я никогда не слышал о таком инструменте.
- person John Saunders   schedule 04.04.2012
Ответы (3)
Вы можете написать свой собственный шаблон T4.
Вот некоторый код, чтобы вы начали:
<#@ 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;
}
}
#>
person
Raj Ranjhan
schedule
04.04.2012
Это почти отлично работает, за исключением того, что он возвращает только первый узел файла xml. Знаете ли вы, как я могу перебрать все узлы в XML-файле?
- person user31673; 05.04.2012
Я понял, что мне нужно изменить, и разместил код ниже. Большое спасибо, что дали мне это направление. Это было ОЧЕНЬ полезно!!
- person user31673; 05.04.2012
Я взял ответ Анурага, изменил его, и вот что у меня работает:
<#@ 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;
}
}
#>
person
user31673
schedule
05.04.2012
Visual Studio Xsd.exe может вам помочь
person
hkutluay
schedule
03.04.2012