从CSV生成XML时对XElement进行分组

时间:2016-12-10 03:41:07

标签: c# wpf linq-to-xml

假设我有一个由第三方生成的* .csv,无法更改。

<Fruit>
  <Apple></Apple>
</Fruit>
<Fruit>
  <Orange></Orange>
</Fruit>
<Animal>
  <Dog></Dog>
</Animal>
<Animal>
  <Cat></Cat>
</Animal>

使用Generate XML from CSV Files中描述的教程,我无法删除第一行并获得以下内容:

<Project Name="ProjectName">
  <Fruit>
    <Apple></Apple>
    <Orange></Orange>
  </Fruit>
  <Animal>
    <Dog></Dog>
    <Cat></Cat>
  </Animal>
</Project>

虽然我想实现以下目标,但找不到任何资源或教程来理解这样做:

public class SeprateClickListener implements View.OnClickListener {
    private Context context;
    public SeprateClickListener(Context context) {
        this.context = context;
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btnOne:
                  break;
            case R.id.btnTwo:
                 break;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

假设文件的第一行始终是名称,请先读取该行,然后将其余部分作为CSV处理。读完行后,按适当的列对它们进行分组,然后构建XML。

XDocument GetXml(string path)
{
    using (var file = File.OpenText(path))
    {
        var name = file.ReadLine();
        return new XDocument(
            new XElement("Project",
                new XAttribute("Name", name),
                from row in ReadRows(file)
                group row.Item2 by row.Item1 into g
                select new XElement(g.Key,
                    from r in g
                    select new XElement(r)
                )
            )
        );
    }
}

IEnumerable<Tuple<string, string>> ReadRows(TextReader file)
{
    using (var reader = new CsvReader(file, new CsvConfiguration { HasHeaderRecord = false, TrimFields = true }))
    {
        while (reader.Read())
            yield return Tuple.Create(reader.GetField(0), reader.GetField(1));
    }
}