我一直在尝试转换以下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 是一个垂直标签,当邮件合并一词发生时,它应该打印换行符。
你能不能帮我解决这个问题?
谢谢。
我没有任何进展。截至目前,我没有代码。
答案 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);