Builder gem中的命名空间属性

时间:2012-05-10 20:40:02

标签: xml namespaces builder

我试图在带有builder gem的Ruby on Rails应用程序中构建此示例:

<?xml version="1.0" encoding="utf-8"?> 
<ngp:contactGet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ngp="http://www.ngpsoftware.com/ngpapi"> 
<campaignID>1033</campaignID> 
<contactID>199434</contactID> 
</ngp:contactGet>

我可以生成带有命名空间的标记,如下所示:

xml = Builder::XmlMarkup.new
xml.ngp :contactGet

...但我无法在该标签内获取属性。

我会认为

xml.ngp :contactGet("xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance" "xmlns:ngp" =>"http://www.ngpsoftware.com/ngpapi"

会起作用,但事实并非如此。

请帮助!

3 个答案:

答案 0 :(得分:7)

想出来:

xml.tag!('gp:contactGet', {"xmlns:xsi"=>"http://www.w3.org/2001/XMLSchema-instance", "xmlns:ngp"=>"http://www.ngpsoftware.com/ngpapi"}) do 
  xml.campaignID("1033")
  xml.contactID("199434")
end

...可生产

<?xml version="1.0" encoding="UTF-8"?>
<gp:contactGet xmlns:ngp="http://www.ngpsoftware.com/ngpapi" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <campaignID>1033</campaignID>
  <contactID>199434</contactID>
</gp:contactGet><to_s/>

答案 1 :(得分:2)

来自Builder&#39的文档:http://builder.rubyforge.org/

  

现在可以获得对XML命名空间的一些支持。如果是第一个   标记调用的参数是一个符号,它将被连接到标记中   生成命名空间:标签组合。这比显示更容易   形容它。

     

xml.SOAP:Envelope do ... end

     

只需在命名空间中的冒号前放置一个空格,即可为构建器生成正确的表单(例如   &#34; SOAP:信封&#34; =&GT; &#34; xml.SOAP:Envelope&#34;)

所以,你可以这样写:

xml.gp :contactGet do
  xml.campaignID("1033")
  xml.contactID("199434")
end

答案 2 :(得分:2)

您可以使用此语法代替xml.tag!('gp:contactGet')

xml.gp :contactGet do 
  xml.contactID, "199434"
end

此外,如果块中的标记需要名称空间,则可以使用以下语法。我无法在其他任何地方找到此信息,因此请在此处添加。

xml.tag!('gp:contactGet') do 
  xml.gp :contactID, "199434"
end

提供以下标记:

<gp:contactGet>
  <gp:contactID>199434</gp:contactID>
</gp:contactGet>