使用LINQ选择XML中的特定节点

本文关键字:节点 LINQ 选择 XML 使用 | 更新日期: 2023-09-27 18:06:33

我正在编写一个函数,用于加载XML文档并将其转换为CSV。因为我只需要XML文件中的一些值,所以我试图实现的目标是只选择我感兴趣的节点。

下面是我的代码:

      XDocument csvDocument = XDocument.Load(tempOutput);
        StringBuilder csvBuilder = new StringBuilder(1000);
        foreach (XElement node in csvDocument.Descendants("Sample"))
        {
            foreach (XElement innerNode in node.Elements())
            {
                        csvBuilder.AppendFormat("{0},", innerNode.Value);
                    }
                    csvBuilder.Remove(csvBuilder.Length -1, 1);
                    csvBuilder.AppendLine();
                }
                csvOut = csvBuilder.ToString();

但是,通过这种方式,我选择了"Sample"节点内的所有子节点。

在XML中,"Sample"树是:

<Sample Type="Object" Class ="Sample">
    <ID>1</ID>
    <Name>10096</Name>
    <Type>2</Type>
    <Rep>0</Rep>
    <Selected>True</Selected>
    <Position>1</Position>
    <Pattern>0</Pattern>
   </Sample>

代码工作完美,但我只需要"ID"answers"Selected"被选中和他们的值写入CSV文件内。

谁能给我指个正确的方向?

谢谢。

使用LINQ选择XML中的特定节点

点击这里了解更多有关Linq-to-xml的信息。你并没有真正地利用XObject s的"连锁性"

var samples = csvDocument.Descendants("Sample")
                         .Select(el => new {
                             Id = el.Element("ID").Value,
                             Selected = el.Elemnt("Selected").Value
                         });

这将为您创建一个IEnumerable<T>,其中'T'是具有属性IdSelected的匿名类型。您可以为类型安全解析(int.Parsebool.Parse) Id和Selected值。但因为你只是写一个StringBuilder对象,你可能不关心…仅供参考。

StringBuilder对象可以这样写:

foreach (var sample in samples) {
    csvBuilder.AppendFormat(myFormattedString, sample.Id, sample.Selected);
}

需要注意的是,匿名对象和for-each循环应该在同一个作用域中。但如果有必要,还是有办法的。

一如既往,剥猫皮的方法不止一种。

…参考注释:

foreach (XElement node in csvDocument.Descendants("Sample"))
{
    foreach (XElement innerNode in node.Elements())
    {
        //    this logic assumes different formatting for values
        //    otherwise, change if statement to || each comparison
        if(innerNode.Name == "ID") {
            // append/format stringBuilder
            continue;
        }
        if(innerNode.Name == "Selected") {
            // append/format stringBuilder
            continue;
        }
    }
    csvBuilder.Remove(csvBuilder.Length -1, 1);
    csvBuilder.AppendLine();
}