2012-10-12 61 views
-1

可能重複:
How to delete xml element with C#?刪除特定的父母和它的孩子們在XML

說我有一個XML文檔,像這樣:

<doc> 
    <car> 
     <color>Red</color> 
     <size>compact</size> 
    </car> 
    <car> 
     <color>Yellow</color> 
     <size>mid-size</size> 
    </car> 
</doc> 

,我想用黃色屬性刪除整個汽車入口,所以xml文件就變成了

<doc> 
    <car> 
     <color>red</color> 
     <size>compact</size> 
    </car> 
</doc> 

我會如何呢?我搜索了高和低,並找到解決方案,但遺憾的是不適用於C#。

+0

什麼是你的搜索該特定節點的標準? – Tariqulazam

+4

你真的搜索過嗎?你的答案几乎可以通過谷歌的第一個鏈接找到「C#xml delete」 – horgh

+0

該節點的所有屬性都是已知的。就我而言,它是一個ID號碼和一個DateTime對象。所以我想我會使用分配給它的ID號搜索節點。 – Kefkamaydie

回答

0

我是如何處理這種情況的:我將整個文件加載到內存中,可以通過將xml反序列化到c#類或xmlnode結構來實現,有很多教程。後綴我對列表或數組進行任何編輯,然後重新編寫並覆蓋整個文件。提供您的文件不具有數百個的記錄不應該有明顯的性能問題

+0

除非這些記錄是巨大的,否則即使是「許多推h」也可能不是很多。 IO比DOM解析更可能出現性能瓶頸,甚至流式API也必須順序讀取整個文件,然後將其寫出。他們的優勢在於處理那些無法將工作集的其餘部分分頁的文檔。 – millimoose

+0

如果您的實際數據與您的示例一樣簡單,那麼下面的答案會更好。我的數據是相當複雜,所以比較容易操作的序列化類比它使用XML語法 – Whistler

0
using System.Xml.XPath; 

...

var doc = XDocument.Parse(xml); 
var list = new List<XElement>(); 
foreach (var element in doc.XPathSelectElements(@"/doc/car[color='Yellow']")) { 
    list.Add(element); 
} 
foreach (var element in list) element.Remove(); 

更新:所以這是沒有改變的集合,而迭代它。

+0

通常調用'Remove'一個'foreach'循環中時導致異常,是不是'XPathSelectElements'的情況? – Guvante

1

你可以使用LINQ到XML:

var yellowCars = from car in xDoc.Elements("doc").Elements("car") 
        where car.Element("Color").Value == "Yellow" 
        select car; 

    foreach (var car in yellowCars) 
    { 
     car.Remove(); 
    } 

    xDoc.Save(); 
相關問題