【问题标题】:Convert XML file to csv file format in c#在c#中将XML文件转换为csv文件格式
【发布时间】: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。

标签: c# xml csv accord.net


【解决方案1】:

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

  1. 将 XML 转换为数据集:

    DataSet ds = new DataSet();
    
    ds.ReadXml(fileNamePath);
    
  2. 将数据表转换为 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。考虑编辑你的帖子,否则你会一直被否决。
      猜你喜欢
      • 2020-03-21
      • 2020-11-03
      • 1970-01-01
      • 1970-01-01
      • 2011-03-05
      • 2015-10-28
      • 2014-11-22
      • 2017-04-18
      相关资源
      最近更新 更多