2012-09-08 51 views
1

使用Nokogiri,我手動創建<video><source>標記。我的代碼如下所示:在Nokogiri中創建一個沒有結束標記的<source>元素

mp4_source_tag = html.create_element('source') 
tag.replace(mp4_source_tag)   
mp4_source_tag['type'] = 'video/mp4' 
mp4_source_tag['src'] = video.mp4_video.url 

將會產生以下HTML:

<source type="video/mp4" src="/system/mp4_videos/1/original/trailer.mp4?1347088365"></source>

然而,這是無效的HTML5。正確的輸出應該是:

<source type="video/mp4" src="/system/mp4_videos/1/original/trailer.mp4?1347088365">

我怎麼會用引入nokogiri到輸出有效HTML5沒有結束</source>標籤?

被替換的標籤是<img>標籤,但這似乎並不重要。

+0

類似問題:http://stackoverflow.com/questions/5459832/how-can-i-make-empty- tags-self-closing-with-nokogiri – 18bytes

+0

它是_invalid_關閉標籤?那是什麼樣的設計決定? –

+0

@MarkThomas一個奇怪的,特別是考慮到合法的結束斜線。 _「起始標籤由可選的」/「字符組成**,僅當元素爲空元素時纔可以出現**。[...] Void元素只有開始標籤; **不能爲空元素**指定結束標記。「_有關更多信息,請參見[void elements](http://www.w3.org/TR/html-markup/syntax.html#syntax-elements)。 – Phrogz

回答

0

如果您將文檔創建爲XML而不是HTML,Nokogiri將輸出帶有斜槓的空元素,例如, <source />;這對HTML5有效。

html = Nokogiri.HTML('') 
puts html.create_element('source') 
#=> <source></source> 

xml = Nokogiri.XML('') 
puts xml.create_element('source') 
#=> <source/> 

這樣做的缺點,但是,是解析有效的HTML5文檔的XML將導致解析錯誤:

require 'nokogiri' 
html5 = '<!DOCTYPE html> 
    <html><head> 
    <meta charset="utf-8"> 
    <title>Test</title> 
    </head><body> 
    <img src="a.jpg"><img src="b.jpg"> 
    </body></html>' 
doc = Nokogiri.XML(html5, &:noblanks) 
puts doc 
#=> <?xml version="1.0"?> 
#=> <!DOCTYPE html> 
#=> <html> 
#=> <head> 
#=>  <meta charset="utf-8"> 
#=>  <title>Test</title> 
#=>  </meta> 
#=>  <body> 
#=>  <img src="a.jpg"> 
#=>   <img src="b.jpg"> 
#=> </img> 
#=>  </img> 
#=>  </body> 
#=> </head> 
#=> </html> 

要解決這個問題,你需要讓你的源是有效的XML通過自動關閉你的void元素(這對HTML5也是有效的)。此外,爲避免XML聲明,您需要分別序列化DTD和根:

require 'nokogiri' 
html5 = '<!DOCTYPE html> 
    <html><head> 
    <meta charset="utf-8"/> 
    <title>Test</title> 
    </head><body> 
    <img src="a.jpg"/><img src="b.jpg"/> 
    </body></html>' 
doc = Nokogiri.XML(html5, &:noblanks) 
puts doc.children.map(&:to_s) 
#=> <!DOCTYPE html> 
#=> <html> 
#=> <head> 
#=>  <meta charset="utf-8"/> 
#=>  <title>Test</title> 
#=> </head> 
#=> <body> 
#=>  <img src="a.jpg"/> 
#=>  <img src="b.jpg"/> 
#=> </body> 
#=> </html> 
相關問題