Walczę do konwersji obiektu do CSV. Oto moje zajęcia:

[XmlRoot(ElementName = "text")]
public class Text
{
    [XmlElement(ElementName = "sentence")]
    public List<Sentence> Sentences { get; set; }
}

[XmlRoot(ElementName = "sentence")]
public class Sentence
{
    [XmlElement(ElementName = "word")]
    public List<string> Words { get; set; }
}

Atrybuty XML są tutaj ze względu na specyfikację, którą obiekt tekstowy musi być serializowany zarówno do XML, jak i CSV. Parsowanie do XML nie było żadnym problemem, jednak nie mogę pomicie osiągnąć analizowania go do formatu CSV. Próbowałem podejść do problemu za pomocą biblioteki CSVHelper, ale dwie zagnieżdżone listy w obiekcie tekstowym powodują pewne problemy.

Na przykład mam XML jak:

<?xml version="1.0" encoding="utf-8"?>
<text xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<sentence>
   <word>dont</word>
   <word>I</word>
   <word>like</word>
   <word>tomatoes</word>
</sentence>
<sentence>
    <word>brother</word>
    <word>loves</word>
    <word>My</word>
   <word>them</word>
 </sentence>
</text>

A pożądane wyjście CSV byłoby coś w rodzaju:

Word0, Word1, Word2, Word3
dont, I, like, tomatoes
brother, loves, My, them

Z góry dziękuję

-2
Paweł Chojęta 9 październik 2020, 13:17

1 odpowiedź

Najlepsza odpowiedź

Oto przykład używający xmlserializer

[XmlRoot(ElementName = "text")]
public class Text
{
    [XmlElement(ElementName = "sentence")]
    public List<Sentence> Sentences { get; set; }
}

[XmlRoot(ElementName = "sentence"), XmlType("sentence")]
public class Sentence
{
    [XmlElement(ElementName = "word")]
    public List<string> Words { get; set; }
}

using (FileStream fs = new FileStream(@"C:\w1\sampleXml1.xml", FileMode.Open))
{
    XmlSerializer serializer = new XmlSerializer(typeof(Text));
    var t = (Text)serializer.Deserialize(fs);
    List<string> list = new List<string>();
    string[] header = { "Word0", "Word1", "Word2", "Word3" };
    list.Add(string.Join(",", header));
    foreach (var item in t.Sentences)
    {
        list.Add(String.Join(",", item.Words));
    }
    File.WriteAllLines(@"C:\w1\output.csv", list);
}
0
GDC 10 październik 2020, 19:14