1

Nokogiriを使用して、手動でタグを作成<video>しています。<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を使用して、終了</source>タグなしで有効なHTML5を出力するにはどうすればよいですか?

置き換えられたタグはタグでした<img>が、それは問題ではないようです。

4

1 に答える 1

0

ドキュメントを HTML ではなく XML として作成すると、Nokogiri は空の要素をスラッシュで閉じて出力します。これは HTML5 で有効です。<source />

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>

これを修正するには、void 要素をセルフクローズしてソースを有効な XML にする必要があります (これは 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>
于 2012-09-12T15:48:26.190 に答える