使用XDocument和LINQ Descendant Confusion读取XML

时间:2017-10-30 16:29:09

标签: c# xml linq linq-to-xml

我正在尝试使用我正在使用的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

非常感谢任何向正确方向的推动!!

1 个答案:

答案 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;
}

这没有异常处理。