2012-04-17 10 views
1

私のコードでは、XMLリクエストを作成しています。しかし、この単純な断片は、エラーが発生:Nokogiri XML Builderエラー - > "ドキュメントにルートノードが既にあります"

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>ですか?

私はここで間違っていますか?

+0

は、私がWebサービスへの正しいXML構造を送信する必要がありますので、私はを取ることができません。 –

+0

サンプルXMLドキュメントに、フォーマットの意味を追加する価値があるかもしれません。 – Jonathan

+0

defayeと同意します。一致するもののXMLサンプルが必要になり、簡単な方法で再現できるようになります。このXMLを構築して私たちに見せるために使用しているすべての変数を取り出してください。 –

答えて

3

私はローカルでこれを再現することはできませんが、代わりにあなたの方法の終わりにこれを試してみてください:

@request_xml.doc.to_xml 

あなたがのルートに新しい<to_xml>ノードを追加しようとしていたことを考えたことが表示されますあなたがすでにルートに<gateways>要素を持っているので、文句を言っています。しかし、なぜNokogiri 1.5.2がこれをやるのかはわかりません。Builder does have a to_xml method

ここで私の作品私の簡単なテストです:

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" 
関連する問題