假设一个<DATA>标签中只有<BASIC>标签可以多次出现,您可以尝试如下(详细情况请参见cmets,它使用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);