1

私のコードでは、XML リクエストを作成しています。ただし、次の単純なフラグメントではエラーが発生します。

def create_gateways_request
  @request_xml = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
    xml.gateways(:ua => "#{@plugin_name} #{@version}") {
      xml.merchant {
        xml.account           MSP['merchant']['account_id']
        xml.site_id           MSP['merchant']['site_id']
        xml.site_secure_code  MSP['merchant']['site_code']
      }
      xml.customer {
        xml.country @customer[:country]
      }
    }
  end
  @request_xml.to_xml
end

エラー:

RuntimeError: Document already has a root node
from /Users/scriptdude/.rvm/gems/ruby-1.9.2-p290/gems/nokogiri-1.5.2/lib/nokogiri/xml/document.rb:212:in `add_child'
from /Users/scriptdude/.rvm/gems/ruby-1.9.2-p290/gems/nokogiri-1.5.2/lib/nokogiri/xml/node.rb:549:in `parent='
from /Users/scriptdude/.rvm/gems/ruby-1.9.2-p290/gems/nokogiri-1.5.2/lib/nokogiri/xml/builder.rb:371:in `insert'
from /Users/scriptdude/.rvm/gems/ruby-1.9.2-p290/gems/nokogiri-1.5.2/lib/nokogiri/xml/builder.rb:363:in `method_missing'
from (irb):146
from /Users/scriptdude/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.1.3/lib/rails/commands/console.rb:45:in `start'
from /Users/scriptdude/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.1.3/lib/rails/commands/console.rb:8:in `start'
from /Users/scriptdude/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.1.3/lib/rails/commands.rb:40:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'

ルートノードは<gateways>ですよね?

ここで何が間違っていますか?

4

1 に答える 1

3

これをローカルで再現することはできませんが、代わりにメソッドの最後でこれを試すことができます。

@request_xml.doc.to_xml

ドキュメントのルートに新しいノードを追加しようとしていると思わ<to_xml>れ、ルートにすでに<gateways>要素があるために文句を言っているようです。ただし、 Builderにはto_xmlメソッドがあるため、Nokogiri1.5.2がこれを行う理由を理解することはできません。

これが私のために働く私の簡単なテストです:

require "nokogiri"
def do_it
  @builder = Nokogiri::XML::Builder.new{ |x| x.root{ x.kid } }
  @builder.to_xml
end

puts do_it
#=> <?xml version="1.0"?>
#=> <root>
#=>   <kid/>
#=> </root>

p Nokogiri::VERSION
#=> "1.5.2"
于 2012-04-17T16:10:39.677 に答える