2008-11-03 101 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