【问题标题】:Reading XML with XDocument and LINQ Descendant Confusion使用 XDocument 和 LINQ 后代混淆读取 XML
【发布时间】:2017-10-30 16:29:08
【问题描述】:

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

我想构建一个 CSV 文件,例如 (t_name, pc_name, p_name)

我目前的代码是这样的

 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

我们将不胜感激任何对正确方向的推动!!

【问题讨论】:

  • 您希望 t_name 和 pc_name 为每个 p_name 重复吗?发布指定 xml 的示例 csv 输出
  • 我编辑了我的原始帖子以包含我正在尝试构建的示例!

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


【解决方案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;
}

这没有异常处理。

【讨论】:

  • 我尝试使用此解决方案,但得到的结果如下: Commodities,ironore_steel,iron,coiled steel Commodities,rubber,merten Rubber, Pressed Rubber
  • 我从您的原始示例中认为这就是您想要的。
猜你喜欢
  • 2012-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-02
  • 2011-02-05
  • 1970-01-01
相关资源
最近更新 更多