0

私はこのxmlを生成しようとしています:

  <ns1:type>Account</ns1:type>
  <ns1:ids>2c92c0f83d60e055013d859f7f4873ee</ns1:ids>
  <ns1:ids>2c92c0f83d60e055013d859f7f2f73ec</ns1:ids>

私はこのコードを使用しています:

def generate_id_xml
  xml = Builder::XmlMarkup.new

  xml.__send__(self.ons, :type, self.remote_name)

  objects.each do |o|
    xml.__send__(self.ons, :ids, o.id)
  end
  xml.xml
end

しかし、それは生産しています:

<ins1:type>Account</ins1:type>
<ins1:ids>2c92c0f93d60e66d013d83e5845e04bc</ins1:ids
<ins1:ids>2c92c0f93d60e66d013d83e5847904be</ins1:ids>
<xml/>

xml/ を追加するのはなぜですか?それを取り除く方法はありますか?

私はこのコードを持っていますが、出力に xml/ タグを追加していません。

def generate_xml
    xml = Builder::XmlMarkup.new
  objects.each do |o|
    generate_object xml, o
  end
  xml.xml           
end
#generate xml for an object
def generate_object(builder, object)
    builder.__send__(self.zns, :zObjects, 'xsi:type' => "ins1:#{self.remote_name}") do |a|
        object.to_hash.each do |k,v|
        a.__send__(self.ons, k.to_s.zuora_camelize.to_sym, v) unless v.nil?
      end
    end
end
4

1 に答える 1

0

xml.xmlxmlメソッド呼び出しをビルダーに送信します 。ビルダーは、すべてのメソッド呼び出しを要素名として処理することで機能しているように見えます。興味深いことに、これによりirbでこれが行われます。

builder = Builder::XmlMarkup.new
 => <inspect/>

要素が表示されるのinspectは、irb がObject#inspect呼び出しの結果を表示するために使用するためです。次に、どのビルダーが「「inspect」という空の要素を追加する」と解釈しますか

他のコードがどのように機能するかはよくわかりませんが、以前の質問に基づいて、いくつかの包含要素を追加するより広いコンテキストがあることを知っています.2番目のコードからXMLを何らかの形で選択またはフィルタリングしている可能性があります作業方法。作業メソッドを分離して直接呼び出してみましたか?

あなたのコードのこのバリエーションを試すと:

def generate_id_xml
  builder = Builder::XmlMarkup.new
  builder.namespace :type, 'contents'
  ['09876','65432'].each do |id|
    builder.ns2 :ids, id
  end
  builder
end

次のxmlを取得します

<namespace:type>contents</namespace:type><ns2:ids>09876</ns2:ids><ns2:ids>65432</ns2:ids>

.xmlだから、あなたの最後の行は不必要であるように私には見えます。2 番目のコード サンプルが正常に機能する理由を説明していません。. .

于 2013-03-20T08:44:48.553 に答える