C# 如何将这种特殊情况下的XML转换为CSV?

C# 如何将这种特殊情况下的XML转换为CSV?,c#,xml,csv,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</

我一直在尝试转换以下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>
\v是一个垂直选项卡,当邮件合并发生时,它应该打印换行符

你能帮我解决这个问题吗

多谢各位

我在任何地方都没有进步。到目前为止,我身上还没有代码。

假设只有
标记可以在一个
标记中多次出现,您可以尝试以下操作(请参阅注释了解详细情况,它正在使用和LINQ to XML):


我们以前只处理过XML,我们使用了dataset.ReadXML(),我们应该只得到一个datatable,但是使用这个XML我们得到了多个datatable,这会中断邮件合并过程。所以我想转换成CSV,真丢脸,我什么地方都没有进展。很抱歉,我现在没有代码。我试图将多个数据表合并为一个,但在重复时遇到了问题。我想把它改成CSV,我在处理XML方面的经验很少,所以我需要一个提示。谢谢@har07,很抱歉我没提到我们不知道XML文件中将包含哪些元素。我提到的XML是一个示例,元素可以是任何东西,因此我可以硬编码标记名称。从上面的示例XML中,我如何知道顺序应该是MEMBNO、BASIC、DOB,而不是MEMBNO、DOB、BASIC或order无关紧要?我指的是处理XML后输出的csv文件中的列顺序,它是否应该按特定顺序排列?不,不必如此,mail merge将按名称映射到特定列。感谢您的帮助。请查看我的更新,如果要求与当前演示的略有不同,您可以进一步调整代码。我假设
下的每个元素都可以出现多次,并且应该以与示例中的
元素相同的方式进行处理。
MEMBNO,BASIC,DOB,
11400116,"15400.00\v15000.00\v,14242.00",,
200,,17/12/1975,
16,26354.00,,
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);
//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);