查询使用LINQ to XML删除最后的结果

时间:2012-08-29 16:36:55

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

我在解析xml文件时遇到问题。下面是一个样本。

<G_LOG>
  <LINE>9206</LINE>
  <TEXT>Generating 
</TEXT>
</G_LOG>
<G_LOG>
  <LINE>9207</LINE>
  <TEXT>Inserted Actual
</TEXT>

O.K,所以这只是文件中数千个节点的快照。我需要搜索TEXT“Inserted Actual”,不仅要删除此节点,还要删除上一个节点。所以它会在第9207行找到文本并删除9206。 (删除上面代码段中的所有内容)

我可以搜索我要删除的行。

 XDocument xmlDoc = XDocument.Load(filename);
 var q = from c in xmlDoc.Descendants("G_LOG")
         where c.Element("TEXT").Value.Contains("Inserted Actual")
         select (string)c.Element("LINE");
 foreach (string name in q)
 {
     Console.WriteLine("Actuals Success on ID : " + name);           
 }

但我不确定如何获取前一个节点并将其删除(没有代码桶)?

2 个答案:

答案 0 :(得分:1)

XElement xmlDoc = XElement.Load("c:\\temp.xml");
 var q = xmlDoc.Descendants("G_LOG").Where(c=>c.Element("TEXT").Value.Contains("Inserted Actual")).Select(d=>d.Element("LINE"));
foreach(XElement elm in q)
{
if(elm.Parent.ElementsBeforeSelf().Count()!=0)
elm.Parent.PreviousNode.Remove();
elm.Parent.RemoveNodes();
}

答案 1 :(得分:1)

var elementsToRemove =
    from logElement in xml.Descendants("G_LOG")
    where logElement.Element("TEXT").Value.Contains("Inserted Actual")
    from element in new[] { logElement, logElement.PreviousNode }
    select element;

foreach(var element in elementsToRemove.ToList())
{
    element.Remove();
}

有几点需要注意:

  1. 第二个from将每个节点及其上一个节点展平为一个序列
  2. .ToList()急切地评估查询,确保我们在评估时不删除节点