2011-04-27 38 views

回答

0
require 'nokogiri' 
doc = Nokogiri::XML " 
<root> 
    <a>foo<c>bar</c></a> 
    <b>jim<d>jam></d></b> 
    <a>more</a> 
    <x>no no no</x> 
</root>" 

doc.xpath('root//*[name()!="a"][name()!="b"]').remove 
puts doc 
#=> <?xml version="1.0"?> 
#=> <root> 
#=> <a>foo</a> 
#=> <b>jim</b> 
#=> <a>more</a> 
#=> 
#=> </root> 
0

如果这只是为了一个问题,没有您需要隔离嵌套的标签,使用XPath而不是引入nokogiri CSS选择器应当在他们的文档以相同的顺序返回标签:

doc.xpath("//a | //h3").each { |o| puts o } 

我不确定这种行为是否在Nokogiri的任何规范中,所以您可能要小心,但根据我的经验,这是真的。

当然,如果你以后的标签是嵌套的,你可能需要定义“删除除某些标签以外的所有标签”的含义(例如,删除标签及其内容存在于未删除的标签内会发生什么和他们的内容等)。

如果您的要求足够复杂,XPath查询不会削减它,您可能需要使用类似doc.root.children的“走路DOM”并递归检查每个节点的子节点。

1

你可能想看看白名单/黑名单/洗刷宝石。想到了SanitizeLoofah

从消毒的描述:

鉴于上可接受的元素和属性的列表,消毒将从字符串中删除所有不能接受的HTML。

从丝瓜的描述:

丝瓜擅长HTML清理(XSS预防)。它包含一些漂亮的HTML清理工具,它们基于HTML5lib的白名单,所以它很可能不会使您的代码不那么安全。 (这些声明并没有被Netexperts评估。)

在这两种情况下,他们会从重新发明车轮拯救你。

相关问题