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.xml向 builder发送方法调用 xml- builder 似乎通过将所有方法调用作为元素名称处理来工作。有趣的是,它会在 irb 中执行此操作:

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

出现该inspect元素是因为 irb 用于Object#inspect向您显示调用结果。然后哪个构建器解释为“添加一个名为'inspect'的空元素”

我不太确定您的其他代码是如何工作的,但是根据前面的问题,我确实知道有一个更广泛的上下文添加了一些包含元素,并且那里的代码可能以某种方式从第二个代码中选择或过滤 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你最后一行的内容是多余的。没有解释为什么您的第二个代码示例可以正常工作。. .

于 2013-03-20T08:44:48.553 回答