在c#中将XML文件转换为csv文件格式

Posted

技术标签:

【中文标题】在c#中将XML文件转换为csv文件格式【英文标题】:Convert XML file to csv file format in c# 【发布时间】:2016-06-08 07:20:57 【问题描述】:

我正在使用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 序列化? 我在accord.net框架网站上找到了使用XML序列化来保存文件的源代码。 我尝试另存为 csv 但不能。 解析 XML,写入 CSV 文件。你不清楚哪一部分? 我想写入 CSV。 【参考方案1】:

将 XML 直接转换为 CSV 是一项有点复杂的任务。取而代之的是,您可以先将 XML 转换为 DataSet,然后再转换为 CSV:

    将 XML 转换为数据集:

    DataSet ds = new DataSet();
    
    ds.ReadXml(fileNamePath);
    

    将数据表转换为 CSV。

    链接:c# datatable to csv

【讨论】:

【参考方案2】:

在另一种方式中,您可以利用 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】:
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 所以这作为一个通用解决方案有点错误,因为它不会转义逗号或引号。 @Rob 这个答案是针对特定问题的,而不是针对一般问题的。【参考方案4】:

只需创建一个 XML 的 csv 文件,使用 System.IO 并确保该文件类似于

fileName = Name + ".csv"

阅读并寻找类似的东西

Path.GetTempPath(), fileName

我有点粗略,但这应该会让你走上正轨

【讨论】:

我试过了,但没用。我只需要 csv 文件中的 x 和 y 坐标。 例如:261,210,261,214,261,231,261,234 我不确定确切的语法,但它应该与此有关 这距离回答 OP 的问题还差得很远。 filename 将类似于 "Name.csv"Path.GetTempPath() 给出 返回当前用户的临时文件夹的路径,不会将 xml 转换为 csv。考虑编辑你的帖子,否则你会一直被否决。

以上是关于在c#中将XML文件转换为csv文件格式的主要内容,如果未能解决你的问题,请参考以下文章

使用 C# 在 XML 文件中转换 CSV

在 C# 中将日志文件转换为 pcap 文件

python [xml文件到voc的csv文件]将voc标签转换为xml格式为csv格式#python #csv #xml

Python中将CSV文件转换为H5AD文件

如何在c#中将XML转换为自定义对象[重复]

我正在使用 C# 将 XML 文件转换为 CSV。我尝试了不同的方法,但无法弄清楚如何访问键名/值对