0

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

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

好的,所以这只是文件中数千个节点的快照。我需要搜索 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);           
 }

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

4

2 回答 2

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();
}
于 2012-08-29T16:51:15.557 回答
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()评估时不会删除节点
于 2012-08-29T17:23:40.273 回答