为什么我无法创建Nokogiri节点?

时间:2016-12-15 21:46:43

标签: ruby-on-rails ruby xml nokogiri

我正在使用Rails 4.2.7与Nokogiri。如何创建新的Nokogiri节点以添加到我的文档中?我以为我能做到这一点

general = doc.xpath("//lomimscc:general")
title = Nokogiri::XML::Node.new "lomimscc:title"
string = Nokogiri::XML::Node.new "lomimscc:string"
string.content = scenario.title
string.language = 'en' 
title << string 
general << title 

但是我收到了错误

ArgumentError: wrong number of arguments (given 1, expected 2+)
    from /Users/davea/Documents/workspace/sims/app/helpers/myproject_helper.rb:73:in `new'
    from /Users/davea/Documents/workspace/sims/app/helpers/myproject_helper.rb:73:in `set_manifest_title'
    from /Users/davea/Documents/workspace/sims/app/helpers/myproject_helper.rb:59:in `generate_manifest_file

2 个答案:

答案 0 :(得分:0)

Nokogiri::XML::Node.new需要2个参数。来自rdoc

.new(name, document) ⇒ Object

答案 1 :(得分:0)

这比你做的容易得多:

require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<html>
  <body>
  </body>
</html>
EOT

此时有一个已解析的文档,看着正文显示它是空的:

doc.at('body').to_html # => "<body>\n  </body>"

Nokogiri非常聪明,知道如果将节点作为字符串传递给该怎么办:

doc.at('body').inner_html = '<p>foo</p>'
doc.at('body').to_html # => "<body><p>foo</p></body>"

解析了字符串,然后将其添加为正文的内部HTML。

它还可以基于其他节点附加节点:

doc.at('p').add_next_sibling('<p>bar</p>')
doc.at('body').to_html # => "<body>\n<p>foo</p>\n<p>bar</p>\n</body>"

当你阅读文档时要密切注意这些参数,因为你会看到node_or_tags这意味着它需要一个Nokogiri :: XML :: Node或一个描述要插入的内容的字符串。

这也意味着使用字符串插值来控制插入内容非常容易:

t = 'foobar'
doc.at('body').inner_html = "<p>#{t}</p>"
doc.at('body').to_html # => "<body><p>foobar</p></body>"