删除XDocument中的后代

时间:2017-11-24 08:12:26

标签: c# xml

我有以下xml:  XML FORMAT FILE

我目前正在从Set节点中提取值,但由于在第一个事务集中找到了删除集,我得到错误 Sequence不包含任何元素

注意我不想在缺少元素的情况下记录空值。

在迭代所有交易时,我想删除存在Delete元素的完整交易

我的代码片段:

 foreach (var trans in xDocument.Descendants("Transaction"))
 {
     //Table Item
     var val1 =(string)trans.Descendants("Set").Elements("szItemID").First();                                
     var val2 =(string)trans.Descendants("Set").Elements("lMerchandiseStructureID").First();
     var val3 = (string)trans.Descendants("Set").Elements("szItemTaxGroupID").First();

    dataToBeWritten.Append(val1);
    dataToBeWritten.Append(",");

    dataToBeWritten.Append(val2);
    dataToBeWritten.Append(",");

    dataToBeWritten.Append(val3);
    dataToBeWritten.Append(",");

    dataToBeWritten.Append(Environment.NewLine);

}

Console.WriteLine(dataToBeWritten.ToString());
Console.ReadLine();

2 个答案:

答案 0 :(得分:2)

为什么不在Insert元素上替换每个?

foreach (var trans in xDocument.Descendants("Insert"))

这将忽略删除节点。

========================================

确定。添加新答案。你需要检查Set.Count()== 0,如果它是0,只需继续循环。

    foreach (var trans in xDoc.Descendants("Transaction"))
    {
        //Table Item
        var itemSet = trans.Descendants("Set");
        if(itemSet.Count()==0) continue;

        var val1 =(string)trans.Descendants("Set").Elements("szItemID").First();                                
        Console.WriteLine(val1);
    }

答案 1 :(得分:0)

如果您想删除带有删除子项的交易,只需执行此类xDocument.Descendants("Transaction").Where(e=>e.Element("Delete")!=null).Remove()之类的操作即可。 但是为了防止异常,您可以使用FirstOrDefault()并测试null甚至更好,因为您只需要fisrt元素,只需使用Element()代替Elements().First()