我正在尝试使用我正在使用的XML构建CSV文件。 XML的结构如下:
<dt_type>
<t_name>Commodities</t_name>
<dt_category>
<pc_name>ironore_steel</pc_name>
<dt_products>
<p_name>iron</p_name>
</dt_products>
<dt_products>
<p_name>coiled steel</p_name>
</dt_products>
</dt_category>
<dt_category>
<pc_name>rubber</pc_name>
<dt_products>
<p_name>molten rubber</p_name>
</dt_products>
<dt_products>
<p_name>pressed rubber</p_name>
</dt_products>
</dt_category>
</dt_type>
我想构建一个像(t_name,pc_name,p_name)
这样的CSV文件我目前的代码就是这个
XDocument xdoc = XDocument.Load(output + "xmlSgx.txt");
//query xml
var xdata = from r in xdoc.Descendants("dt_category")
select new
{
//tName = r.Element("t_name").Value,
pcName = (string)r.Element("pc_name"),
pName = (string)r.Element("dt_products").Element("p_name")
};
foreach (var r in xdata)
{
result.AppendLine(r.pcName + "," + r.pName);
}
using (StreamWriter file = new StreamWriter(output + "xmlRes.txt"))
{
file.Write(result);
}
我能够产生的最佳输出是:
ironore_steel,iron
rubber,molten rubber
当我从
下降时,我甚至无法拉多次我想要提取的一个例子:
Commodities,ironore_steel,iron
Commodities,ironore_steel,coiled steel
Commodities,rubber,molten rubber
Commodities,rubber,pressed rubber
非常感谢任何向正确方向的推动!!
答案 0 :(得分:1)
您只从每个类别中选择一个节点。 此方法将每个类别作为一行返回,您可以使用File.WriteAllLines将其推送到文本文件
private static IEnumerable<string> GetLines()
{
XDocument doc = XDocument.Parse(data);
var title = doc.Descendants("t_name").First().Value;
var xdata = from r in doc.Descendants("dt_category")
select title + "," + (string)r.Element("pc_name") + "," + string.Join(",", r.Descendants("p_name").Select(e => e.Value.ToString()).ToArray());
return xdata;
}
看到所需的输出后更新:
private static IEnumerable<string> GetLines2()
{
XDocument doc = XDocument.Parse(data);
var title = doc.Descendants("t_name").First().Value;
var names = doc.Descendants("p_name");
var lines = from n in names select title + "," + n.Parent.Parent.Descendants("pc_name").First().Name + "," + n.Value;
return lines;
}
这没有异常处理。