0

xmlファイルの解析に問題があります。サンプルを以下に示します。

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

OK、これはファイル内の数千のノードのスナップショットにすぎません。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. 2つ目fromは、各ノードとその前のノードを1つのシーケンスにフラット化します
  2. .ToList()熱心にクエリを評価し、評価中にノードを削除しないようにします
于 2012-08-29T17:23:40.273 に答える