2011-04-27 63 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評估。)

在這兩種情況下,他們會從重新發明車輪拯救你。

相關問題