2008-11-03 98 views
2

我想刪除特定標記的出現,使內部XML保持不變。我希望通過一次傳遞來完成此操作(而不是搜索,替換,並從頭開始)。例如,從源頭:從XML中刪除標記出現

<element> 
    <RemovalTarget Attribute="Something"> 
     Content Here 
    </RemovalTarget> 
</element> 
<element> 
    More Here 
</element> 

我希望得到的結果是:

<element> 
    Content Here 
</element> 
<element> 
    More Here 
</element> 

我已經試過這樣的事情(原諒我,我是新來的LINQ):

var elements = from element in doc.Descendants() 
       where element.Name.LocalName == "RemovalTarget" 
       select element; 

foreach (var element in elements) { 
    element.AddAfterSelf(element.Value); 
    element.Remove(); 
} 

但通過循環的第二次我得到一個空引用,大概是因爲該集合通過更改它是無效的。什麼是一個有效的方式來在一個潛在的大文件上移除這些標籤?

回答

3

您必須通過調用ToList來跳過延遲執行,這可能不會損害您在大型文檔中的性能,因爲您只是要迭代並在比原始搜索。正如@jacob_c指出的那樣,我應該使用element.Nodes()來正確替換它,正如@Panos指出的那樣,我應該顛倒這個列表來正確處理嵌套替換。

此外,使用XElement.ReplaceWith,比大型文檔您當前的方法快得多:

var elements = doc.Descendants("RemovalTarget").ToList().Reverse(); 
/* reverse on the IList<T> may be faster than Reverse on the IEnumerable<T>, 
* needs benchmarking, but can't be any slower 
*/ 

foreach (var element in elements) { 
    element.ReplaceWith(element.Nodes()); 
} 

最後一點,在審查什麼,這可能是用於,我傾向於@Trull同意,XSLT可能你真的在找什麼,如果說你要刪除所有文件中的<b>標籤。否則,享受這個相當體面和相當良好的LINQ to XML實現。

+0

。如果RemovalTarget元素包含子元素,則值無效 – 2008-11-03 21:18:42

3

您是否考慮過使用XSLT?看起來像是完美的營養,就像你在做XSLT的意義,將一個XML文檔轉換成另一個。模板系統將爲您解決嵌套的問題。

Here是一個基本的例子

0

我建議要麼做XSLT作爲Trull酒店推薦爲最佳解決方案。

或者您可以看看使用字符串生成器和正則表達式匹配來刪除項目。

你可以看看遍歷文檔,以及使用節點和父節點來有效地將代碼從節點內移動到父節點,但這將是乏味的,並且對於其他可能的解決方案來說非常不必要那裏。

0

一個輕量級的解決方案是使用XmlReader來通過輸入文檔和XmlWriter來寫輸出。

注意:XmlReader和XmlWriter類是抽象的,使用適合您的情況的派生類。

0

根據您如何管理XML,您可以使用正則表達式來刪除標記。

這裏有一個簡單的控制檯應用程序,演示如何使用正則表達式的:

static void Main(string[] args) 
    { 
     string content = File.ReadAllText(args[0]); 

     Regex openTag = new Regex("<([/]?)RemovalTarget([^>]*)>", RegexOptions.Multiline); 

     string cleanContent = openTag.Replace(content, string.Empty); 
     File.WriteAllText(args[1], cleanContent); 
    } 

這使得換行符的文件,但它不應該太困難,以增加正則表達式。

+1

將XML作爲字符串數據處理非常簡單,如果您可以控制源XML並且無數複雜(如果不具備)。野外的XML包含CDATA和註釋,並且引入了許多特殊情況,通常最好堅持使用基於DOM的方法。 – 2008-11-04 19:53:42