2011-02-06 34 views
1

我有一些示例HTML,我已經用一些特殊標記標記了一些不同的程序,下面是一個html示例。你應該注意到<START:organization>..<END>元素。在Nokogiri中保留自定義元素上的名稱空間HTML

<html> 
<head/> 
<body> 
    <ul> 
    <li> <START:organization> Advanced Integrated Pest Management <END> </li> 
    <li> <START:organization> American Bakers Association <END> </li> 
    </ul> 
</body> 
</html> 

我想用引入nokogiri來預處理HTML輕鬆去除像<script>無關的標籤。我創建了下面的延伸到引入nokogiri文檔類:

module Nokogiri 
    module HTML 
    class Document 
     def prepare_html 
     xpath("//script").remove 
     to_html.remove_new_lines 
     end 
    end 
    end 
end 

的問題是,引入nokogiri正在改變<START:organization>元件<organization>

無論如何,我可以保留HTML來維護我的自定義標記標籤?

回答

1

像另外兩個人說的,如果你的輸入不是標準的XML和HTML,你不能真正期待爲它設計的解析器工作。

不過你可以做下列操作之一:

  1. 砍了引入nokogiri爲這個 情況
  2. 工作改變其他程序,您使用的 (很好奇是什麼),以 後續標準
  3. 爲您正在使用的DSL編寫單獨的 解析器
1

一個長鏡頭,但嘗試補丁Nokogiri :: XML ::文檔和/或使用to_xml而不是 - 命名空間在HTML中無效,所以我猜Nokogiri不會解析/生成它們。

當然,您的<END>標記也不是有效的XML,因此您的文檔在任何標準中都是無效的。

1

如果您的標記有效,您可以使用XML解析器而不是HTML解析器來解析它。

編輯:剛剛意識到這一點:

<START:organization>..<END> 

有一對夫婦的問題在這裏。首先,開始和結束標記不匹配。如果開始標籤是''then it should be terminated by`。其次,在節點名稱中使用冒號在XML中具有一定含義 - 即第一部分是命名空間,第二部分是節點名稱。在這種情況下,您應該使用名爲「organization」的標籤,或者將其放在屬性中。第一個可能是最有意義的。所以:

<organization>..</organization> 

如果你不能改變這個,那麼你不能使用XML/HTML解析器,因爲它不是有效的XML和HTML。

相關問題