我在解析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);
}
但我不确定如何获取前一个节点并将其删除(没有代码桶)?
答案 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();
}
有几点需要注意:
from
将每个节点及其上一个节点展平为一个序列.ToList()
急切地评估查询,确保我们在评估时不删除节点