I am using accord.net mouse gesture recognition sample application, which saves the file in above xml format. I need help to convert above xml in to CSV format so i can do machine learning using accord.net Dynamic time warping. I can not figure out how to convert in to csv file.
For example: 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>
using System.IO;
using System.Xml.Serialization;
You can do like this:
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);
}
In an alternate way you can use leverage the power of XSLT to convert it,
XslCompiledTransform()
to convert get the csv stringYou may came up with an Xslt like this, call it 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>
and use the following method
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;
}
and call it like this
var csvString = ToCSV("yourfile.xml","data.xsl");
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With