[英]How to convert XML to CSV (C#)
XML:
<?xml version="1.0" standalone="yes"?>
<NewDataSet>
<Company>
<Title>Seph</Title>
<Commentary>blah-blah</Commentary>
<Worker1>Bill</Worker1>
<Worker2>Fill</Worker2>
</Company>
<JobDetails>
<JobNum>1</JobNum>
<Detail1>Sport</Detail1>
<Detail2>Physical</Detail2>
</JobDetails>
<JobDetails>
<JobNum>2</JobNum>
<Detail1>Mailman</Detail1>
<Detail2>pastoral</Detail2>
</JobDetails>
<JobDetails />
</NewDataSet>
我有一个代码转换器(XML 到 CSV)的例子,但它没有标题“公司”和“JobDetails”。 我需要这个标题,你能帮我改进这个代码吗?
using System;
using System.Text;
using System.IO;
using System.Xml.Linq;
using System.Linq;
namespace XML_CSV
{
class Class1
{
static void Main()
{
StringBuilder sb = new StringBuilder();
string delimiter = "|";
XDocument.Load(@"C:\Users\Iuser\Desktop\Data.xml").Descendants("NewDataSet").ToList().ForEach(element => sb.Append(
element.Element("Company").Value + delimiter + //something maybe bad here
element.Element("Title").Value + delimiter +
element.Element("Commentary").Value + delimiter +
element.Element("Worker1").Value + delimiter +
element.Element("Worker2").Value + delimiter +
element.Element("JobDetails").Value + delimiter + //something maybe bad here
element.Element("Detail1").Value + delimiter +
element.Element("Detail2").Value + "\r\n"));
StreamWriter sw = new StreamWriter(@"C:\Users\Iuser\Desktop\DataCSV.csv");
sw.WriteLine(sb.ToString());
sw.Close();
}
}
}
可能代码不起作用,因为视觉认为“Company”和“JobDetails”是不同的表。 这应该看起来像这样(在课程的 CSV 中): Company JobDetails
它应该在一个 CSV 文件中。
Output 文字:
Title,Commentary,Worker1,Worker2
Seph,blah-blah,Bill,Fill
JobNum,Detail1,Detail2
1,Sport,Physical
2,Mailman,pastoral
通过使用 XSLT。
XSLT
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/NewDataSet">
<xsl:text>Title,Commentary,Worker1,Worker2</xsl:text>
<xsl:text>
</xsl:text>
<xsl:apply-templates select="Company"/>
<xsl:text>JobNum,Detail1,Detail2</xsl:text>
<xsl:text>
</xsl:text>
<xsl:for-each select="JobDetails[*]">
<xsl:value-of select="concat(JobNum, ',', Detail1, ',', Detail2)"/>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
<xsl:template match="Company">
<xsl:value-of select="concat(Title, ',', Commentary, ',', Worker1, ',', Worker2)"/>
<xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
c#
void Main()
{
const string SOURCEXMLFILE = @"e:\Temp\XML_to_CSV\input.xml";
const string XSLTFILE = @"e:\Temp\XML_to_CSV\process.xslt";
const string OUTPUTFILE = @"e:\Temp\XML_to_CSV\output.csv";
try
{
XsltArgumentList xslArg = new XsltArgumentList();
using (XmlReader src = XmlReader.Create(SOURCEXMLFILE))
{
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load(XSLTFILE, new XsltSettings(true, true), new XmlUrlResolver());
XmlWriterSettings settings = xslt.OutputSettings.Clone();
settings.IndentChars = "\t";
// to remove BOM
settings.Encoding = new UTF8Encoding(false);
using (XmlWriter result = XmlWriter.Create(OUTPUTFILE, settings))
{
xslt.Transform(src, xslArg, result, new XmlUrlResolver());
result.Close();
}
}
Console.WriteLine("File '{0}' has been generated.", OUTPUTFILE);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
Output
Title,Commentary,Worker1,Worker2
Seph,blah-blah,Bill,Fill
JobNum,Detail1,Detail2
1,Sport,Physical
2,Mailman,pastoral
好吧,使用 XSLT 将 xml 转换为 csv 是一种方法。 这是使用Cinchoo ETL的另一种方法,这是一个以本地方式执行转换的开源库
StringBuilder csv1 = new StringBuilder();
using (var r = new ChoXmlReader("XmlFile3.xml")
.WithXPath("/Company")
)
{
using (var w = new ChoCSVWriter(csv1)
.WithFirstLineHeader()
.UseNestedKeyFormat(false)
)
w.Write(r);
}
StringBuilder csv2 = new StringBuilder();
using (var r = new ChoXmlReader("XmlFile3.xml")
.WithXPath("/JobDetails")
)
{
using (var w = new ChoCSVWriter(csv2)
.WithFirstLineHeader()
.UseNestedKeyFormat(false)
)
w.Write(r);
}
string combinedCSV = csv1.ToString() + Environment.NewLine + csv2.ToString();
Console.WriteLine(combinedCSV);
Output:
Title,Commentary,Worker1,Worker2
Seph,blah-blah,Bill,Fill
JobNum,Detail1,Detail2
1,Sport,Physical
2,Mailman,pastoral
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.