Nokogiri不应包括DOCTYPE

时间:2013-11-25 10:25:23

标签: ruby nokogiri

我正在尝试使用Nokogiri生成部分HTML文档,例如类似的东西:

html_content = Nokogiri::HTML::Builder.new() do |doc|
  # producing document here, redacted for brevity
end.to_html

这很好用,除了一点点捕获:数据稍后将被分派到远程Drupal驱动的服务器并作为页面的一部分呈现,因此包含初始{{1声明。

我如何说服Nokogiri不生成<!DOCTYPE html ...>标签?或者Nokogiri的HTML构建者是错误的方法吗?

提前致谢。

2 个答案:

答案 0 :(得分:6)

要实现此目的,您可以使用document fragmentsBuilder.with方法,如下所示:

require 'nokogiri'
include Nokogiri

fragment = HTML.fragment('')

HTML::Builder.with(fragment) do |f|
  f.div('foo')
end

fragment.to_html
# => <div>foo</div>

答案 1 :(得分:1)

Nokogiri可以轻松创建可以随时填充的模板;我这样做:

require 'nokogiri'

DESTINATION_HOST = 'http://www.example.com/some/API/call'

HTML_TEMPLATE = <<EOT
<form method="post">
  <input name="user" type="text">
  <input name="desc" type="text">
</form>
<div id="quote">
</div>
EOT

doc = Nokogiri::HTML::DocumentFragment.parse(HTML_TEMPLATE)

doc.at('form')['action'] = DESTINATION_HOST
doc.at('div').content = "Danger is my middle name."
[
  ['user', 'Austin Powers'],
  ['desc', 'Man of Mystery'],
].each do |name, value|
  doc.at("input[name=\"#{name}\"]")['value'] = value
end

puts doc.to_html
# >> <form method="post" action="http://www.example.com/some/API/call">
# >>   <input name="user" type="text" value="Austin Powers"><input name="desc" type="text" value="Man of Mystery">
# >> </form>
# >> <div id="quote">Danger is my middle name.</div>

可以从CSV或YAML文件,从其他主机动态检索的JSON或直接从数据库调用中轻松加载已填充的数组和其他字段。

您事先知道文档的外观,因此请使用该知识创建模板。 Nokogiri的Builder更适合那些你甚至不确定你需要什么标签并且需要动态构建整个文档结构的时候。

最难的部分是定义如何循环文档中的各种标记以填充内容或填写参数,但是一旦完成,就可以轻松创建样板,填写和转发别的什么。