在 C# 中将 XML 文件转换为 csv 文件格式
Convert XML file to csv file format in c#
我正在使用 accord.net 鼠标手势识别示例应用程序,它以上述 xml 格式保存文件。我需要帮助将以上 xml 转换为 CSV 格式,以便我可以使用 accord.net 动态时间扭曲进行机器学习。我不知道如何转换成 csv 文件。
例如:261,210,261,214,261,229,261,231
<?xml version="1.0"?>
<ArrayOfSequence xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Sequence>
<SourcePath>
<Point>
<X>261</X>
<Y>210</Y>
</Point>
<Point>
<X>261</X>
<Y>214</Y>
</Point>
<Point>
<X>261</X>
<Y>227</Y>
</Point>
<Point>
<X>261</X>
<Y>229</Y>
</Point>
<Point>
<X>261</X>
<Y>231</Y>
</Point>
<Point>
<X>261</X>
<Y>234</Y>
</Point>
<Point>
<X>261</X>
<Y>237</Y>
</Point>
</Sequence>
</ArrayOfSequence>
只需创建 XML 的 csv 文件,使用 System.IO 并确保文件类似于
fileName = Name + ".csv"
仔细阅读并寻找类似的内容
Path.GetTempPath(), fileName
我有点粗略,但这应该会让你走上正轨
using System.IO;
using System.Xml.Serialization;
你可以这样做:
public class Sequence
{
public Point[] SourcePath { get; set; }
}
using (FileStream fs = new FileStream(@"D:\youXMLFile.xml", FileMode.Open))
{
XmlSerializer serializer = new XmlSerializer(typeof(Sequence[]));
var data=(Sequence[]) serializer.Deserialize(fs);
List<string> list = new List<string>();
foreach(var item in data)
{
List<string> ss = new List<string>();
foreach (var point in item.SourcePath) ss.Add(point.X + "," + point.Y);
list.Add(string.Join(",", ss));
}
File.WriteAllLines("D:\csvFile.csv", list);
}
您可以使用另一种方式利用 XSLT 的强大功能来转换它,
步骤
- 创建一个 Xml 样式表以将 xml 转换为 csv
- 使用
XslCompiledTransform()
转换得到csv字符串
- 将 csv 字符串保存到文件
你可能想出了这样一个 Xslt,称之为 data.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" version="1.0" encoding="UTF-8"/>
<xsl:template match="/">
<xsl:for-each select="//Point">
<xsl:value-of select="X"/>,<xsl:value-of select="Y"/>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
并使用以下方法
public static string ToCSV(string xmlTextDate, string xsltFile)
{
string result = string.Empty;
var xpathDoc = new XPathDocument(xmlTextDate);
var xsltTransform = new System.Xml.Xsl.XslCompiledTransform();
xsltTransform.Load(xsltFile);
using (MemoryStream ms = new MemoryStream())
{
var writer = new XmlTextWriter(ms, Encoding.UTF8);
using (var rd = new StreamReader(ms))
{
var argList = new System.Xml.Xsl.XsltArgumentList();
xsltTransform.Transform(xpathDoc, argList, writer);
ms.Position = 0;
result = rd.ReadToEnd();
}
}
return result;
}
然后这样称呼它
var csvString = ToCSV("yourfile.xml","data.xsl");
将 XML 直接转换为 CSV 是一项有点复杂的任务。取而代之的是,您可以先将 XML 转换为 DataSet
,然后再转换为 CSV:
正在将 XML 转换为数据集:
DataSet ds = new DataSet();
ds.ReadXml(fileNamePath);
正在将 DataTable 转换为 CSV。
Link: c# datatable to csv
我正在使用 accord.net 鼠标手势识别示例应用程序,它以上述 xml 格式保存文件。我需要帮助将以上 xml 转换为 CSV 格式,以便我可以使用 accord.net 动态时间扭曲进行机器学习。我不知道如何转换成 csv 文件。
例如:261,210,261,214,261,229,261,231
<?xml version="1.0"?>
<ArrayOfSequence xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Sequence>
<SourcePath>
<Point>
<X>261</X>
<Y>210</Y>
</Point>
<Point>
<X>261</X>
<Y>214</Y>
</Point>
<Point>
<X>261</X>
<Y>227</Y>
</Point>
<Point>
<X>261</X>
<Y>229</Y>
</Point>
<Point>
<X>261</X>
<Y>231</Y>
</Point>
<Point>
<X>261</X>
<Y>234</Y>
</Point>
<Point>
<X>261</X>
<Y>237</Y>
</Point>
</Sequence>
</ArrayOfSequence>
只需创建 XML 的 csv 文件,使用 System.IO 并确保文件类似于
fileName = Name + ".csv"
仔细阅读并寻找类似的内容
Path.GetTempPath(), fileName
我有点粗略,但这应该会让你走上正轨
using System.IO;
using System.Xml.Serialization;
你可以这样做:
public class Sequence
{
public Point[] SourcePath { get; set; }
}
using (FileStream fs = new FileStream(@"D:\youXMLFile.xml", FileMode.Open))
{
XmlSerializer serializer = new XmlSerializer(typeof(Sequence[]));
var data=(Sequence[]) serializer.Deserialize(fs);
List<string> list = new List<string>();
foreach(var item in data)
{
List<string> ss = new List<string>();
foreach (var point in item.SourcePath) ss.Add(point.X + "," + point.Y);
list.Add(string.Join(",", ss));
}
File.WriteAllLines("D:\csvFile.csv", list);
}
您可以使用另一种方式利用 XSLT 的强大功能来转换它,
步骤
- 创建一个 Xml 样式表以将 xml 转换为 csv
- 使用
XslCompiledTransform()
转换得到csv字符串 - 将 csv 字符串保存到文件
你可能想出了这样一个 Xslt,称之为 data.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" version="1.0" encoding="UTF-8"/>
<xsl:template match="/">
<xsl:for-each select="//Point">
<xsl:value-of select="X"/>,<xsl:value-of select="Y"/>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
并使用以下方法
public static string ToCSV(string xmlTextDate, string xsltFile)
{
string result = string.Empty;
var xpathDoc = new XPathDocument(xmlTextDate);
var xsltTransform = new System.Xml.Xsl.XslCompiledTransform();
xsltTransform.Load(xsltFile);
using (MemoryStream ms = new MemoryStream())
{
var writer = new XmlTextWriter(ms, Encoding.UTF8);
using (var rd = new StreamReader(ms))
{
var argList = new System.Xml.Xsl.XsltArgumentList();
xsltTransform.Transform(xpathDoc, argList, writer);
ms.Position = 0;
result = rd.ReadToEnd();
}
}
return result;
}
然后这样称呼它
var csvString = ToCSV("yourfile.xml","data.xsl");
将 XML 直接转换为 CSV 是一项有点复杂的任务。取而代之的是,您可以先将 XML 转换为 DataSet
,然后再转换为 CSV:
正在将 XML 转换为数据集:
DataSet ds = new DataSet(); ds.ReadXml(fileNamePath);
正在将 DataTable 转换为 CSV。
Link: c# datatable to csv