在C#中将XML文件转换为CSV文件格式

12

我正在使用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序列化? - Orel Eraki
我在accord.net框架的网站上找到了源代码,它使用XML序列化来保存文件。 - Sohaib Omar
我尝试保存为csv文件,但失败了。 - Sohaib Omar
1
解析XML,写入CSV文件。你有什么不明白的地方吗? - L-Four
我想要写入CSV。 - Sohaib Omar
显示剩余3条评论
4个回答

11
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);
}

以上代码将写入CSV文件,格式为{X=261,Y=210},{X=261,Y=214},{X=261,Y=227},{X=261,Y=229}。我需要将这些点转换为261,210,261,214,261,227,261,229的格式。 - Sohaib Omar
所以作为一般解决方案,这有点有缺陷,因为它没有转义逗号或引号。 - Rob
@Rob 这个答案是针对特定问题的,而不是一般性的。 - Thanh Nguyen

4

另一种方法是利用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>&#xD;&#xA;</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");

3
将XML直接转换为CSV是一项有些复杂的任务。相反,你可以先将XML转换为DataSet,然后再将其转换为CSV:
  1. Converting XML to Dataset:

    DataSet ds = new DataSet();
    
    ds.ReadXml(fileNamePath);
    
  2. Converting DataTable to CSV.

    Link: c# datatable to csv


-12
只需创建一个 XML 的 csv 文件,使用 System.IO 并确保文件类似于:
fileName = Name + ".csv"

请阅读并寻找类似的内容

Path.GetTempPath(), fileName

我有点模糊,但那应该能让你走上正确的轨道


我尝试过了,但是没有成功。我只需要在我的CSV文件中X和Y坐标。 - Sohaib Omar
261,210,261,214,261,231,261,234 - Sohaib Omar
我不确定确切的语法,但它应该与此有关。 - Nonagon
3
这甚至没有接近回答OP的问题。 - Anonymous
filename 将会像 "Name.csv" 一样,而 Path.GetTempPath() 则会返回当前用户临时文件夹的路径。这不会将 xml 转换为 csv。请考虑编辑您的帖子,否则您将继续被投票降低。 - Vinod Srivastav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接