【问题标题】:Query to remove last result using LINQ to XML使用 LINQ to XML 查询以删除最后一个结果
【发布时间】:2012-08-29 16:36:55
【问题描述】:

我在解析 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。 (删除上面sn-p中的所有内容)

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

 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);           
 }

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

【问题讨论】:

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


【解决方案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() 急切地评估查询,确保我们在评估时不会删除节点

【讨论】:

    【解决方案2】:
    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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多