如何将此特殊情况XML转换为CSV?

时间:2014-02-03 13:05:37

标签: c# xml csv

我一直在尝试转换以下XML

<root>
<data>
  <MEMBNO>11400116</MEMBNO> 
  <BASIC>15400.00</BASIC> 
  <BASIC>15000.00</BASIC> 
  <BASIC>14242.50</BASIC> 
</data>
<data>
   <MEMBNO>200</MEMBNO>
   <DOB>17/02/1975</DOB>
</data>
<data>
   <MEMBNO>16</MEMBNO>
   <BASIC>26354.00</BASIC>
</data>
</root>

像这样的CSV。

MEMBNO,BASIC,DOB,
11400116,"15400.00\v15000.00\v,14242.00",,
200,,17/12/1975,
16,26354.00,,

\ v 是一个垂直标签,当邮件合并一词发生时,它应该打印换行符。

你能不能帮我解决这个问题?

谢谢。

我没有任何进展。截至目前,我没有代码。

1 个答案:

答案 0 :(得分:2)

假设只有<BASIC>标记可以在一个<DATA>标记中多次出现,您可以尝试如下(请参阅有关详细信息的评论,使用XDocument和LINQ -to-XML):

var xml = @"<root>
<data>
  <MEMBNO>11400116</MEMBNO> 
  <BASIC>15400.00</BASIC> 
  <BASIC>15000.00</BASIC> 
  <BASIC>14242.50</BASIC> 
</data>
<data>
   <MEMBNO>200</MEMBNO>
   <DOB>17/02/1975</DOB>
</data>
<data>
   <MEMBNO>16</MEMBNO>
   <BASIC>26354.00</BASIC>
</data>
</root>";
var doc = XDocument.Parse(xml);
var output = "";
//loop through each <data>
foreach(var data in doc.Descendants("data"))
{
    //get <MEMBNO> under current <data>
    var membno = (string)data.Element("MEMBNO");
    //get all <BASIC> under current <data>
    var basic = string.Join("\v", data.Elements("BASIC").Select(o => (string)o).ToArray());
    if (!string.IsNullOrEmpty(basic)) basic = "\"" + basic + "\"";
    //get <DOB> under current <data>
    var dob = (string)data.Element("DOB");
    //construct line with format MEMBNO,BASIC,DOB,
    var line = string.Format("{0},{1},{2},", membno, basic, dob);

    output += line + Environment.NewLine;
}
Console.WriteLine(output);

可以调整上面的代码,以容纳每个<data>下未知数量的元素和未知元素名称。检查下面的更新代码,它将生成与.csv样本相同的输出而没有硬编码元素名称(假设doc变量与上面的代码块相同):

//get distinct list of element name under <data>
var columns = doc.Root.Elements("data").Elements().Select(o => o.Name.LocalName).Distinct().ToList();
var output = "";
//add header to 'output' : MEMBNO,BASIC,DOB,
columns.ForEach(o => output += o + ",");
foreach (var data in doc.Descendants("data"))
{
    var line = Environment.NewLine;
    foreach (var column in columns)
    {
        var cellValue = string.Join("\v", data.Elements(column).Select(o => (string)o).ToArray());
        if (!string.IsNullOrEmpty(cellValue)) cellValue = "\"" + cellValue + "\"";
        line += cellValue + ",";
    }
    output += line;
}
Console.WriteLine(output);