Преобразование файла XML в формат файла csv в c #

Я использую пример приложения для распознавания жестов мыши accord.net, которое сохраняет файл в указанном выше формате xml. Мне нужна помощь в преобразовании вышеуказанного xml в формат CSV, чтобы я мог выполнять машинное обучение с помощью Accord.net Dynamic time warping. Я не могу понять, как конвертировать в файл 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>

person Sohaib Omar    schedule 25.02.2016    source источник
comment
Почему вы используете сериализацию XML?   -  person Orel Eraki    schedule 25.02.2016
comment
Я нашел исходный код на веб-сайте платформы accord.net, который использует сериализацию XML для сохранения файла.   -  person Sohaib Omar    schedule 25.02.2016
comment
Я пытался сохранить как csv, но не смог.   -  person Sohaib Omar    schedule 25.02.2016
comment
Разобрать XML, записать в файл CSV. Какая часть вам непонятна?   -  person L-Four    schedule 25.02.2016
comment
хочу написать в CSV.   -  person Sohaib Omar    schedule 25.02.2016
comment
Вы искали? stackoverflow.com/questions/18757097/writing-data-into -csv-файл   -  person L-Four    schedule 25.02.2016
comment
Мне нужны только координаты x и y в моем файле csv. например: 261,210,261,214,261,231,261,234   -  person Sohaib Omar    schedule 25.02.2016
comment
У меня есть файл в формате xml, я хочу преобразовать его в формат csv. например: 261,210,261,214,261,231,261,234   -  person Sohaib Omar    schedule 25.02.2016


Ответы (4)


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);
}
person Tuyen Pham    schedule 25.02.2016
comment
Приведенный выше код записывается в файл 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 - person Sohaib Omar; 25.02.2016
comment
так что это немного ошибочное решение как общее решение, так как оно не экранирует запятые или кавычки. - person Rob; 17.10.2017
comment
@Rob, этот ответ предназначен для конкретной проблемы, а не для общей. - person Tuyen Pham; 17.10.2017

В качестве альтернативы вы можете использовать возможности 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");
person Vinod Srivastav    schedule 16.06.2018

Преобразование XML непосредственно в CSV - довольно сложная задача. Вместо этого вы можете сначала преобразовать свой XML в DataSet, а затем в CSV:

  1. Преобразование XML в набор данных:

    DataSet ds = new DataSet();
    
    ds.ReadXml(fileNamePath);
    
  2. Преобразование DataTable в CSV.

    Ссылка: c # datatable to csv

person Ravi Kumar    schedule 01.10.2020

Просто создайте CSV-файл XML, используйте System.IO и убедитесь, что файл похож на

fileName = Name + ".csv"

Прочтите и найдите что-то вроде этого

Path.GetTempPath(), fileName

Я немного схематичен, но это должно направить вас на верный путь

person Nonagon    schedule 25.02.2016
comment
я пробовал, но это не сработало. Мне нужны только координаты x и y в моем файле csv. - person Sohaib Omar; 25.02.2016
comment
например: 261,210,261,214,261,231,261,234 - person Sohaib Omar; 25.02.2016
comment
Я не уверен в точном синтаксисе, но это должно иметь какое-то отношение к этому - person Nonagon; 25.02.2016
comment
Это даже не близко к ответу на вопрос ОП. - person Anonymous; 19.04.2018
comment
filename будет похож на "Name.csv", а Path.GetTempPath() дает Возвращает путь к временной папке текущего пользователя, которая не преобразует xml в csv. Подумайте о том, чтобы отредактировать свой пост, иначе вы будете продолжать получать отрицательные голоса. - person Vinod Srivastav; 16.06.2018