将Web服务的XML响应存储到Rails模型中

时间:2012-07-12 05:51:54

标签: ruby-on-rails

我正在通过VMware Orchestrator API开发VMware vCenter的自定义门户。我正在使用savon来查询Orchestrator的SOAP API(WSDL)并返回有效数据...特别是包含所有虚拟机的XML。

将响应捕获到Rails模型中的最佳/最简单方法是什么?响应的XML结构如下......

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Body>
      <findResponse xmlns="http://webservice.vso.dunes.ch">
         <findReturn>
            <totalCount>4</totalCount>
            <elements>
               <item>
                  <type>VC:VirtualMachine</type>
                  <id>vc.demo.local/vm-37</id>
                  <properties>
                     <item>
                        <name>displayName</name>
                        <value>FreeNAS</value>
                     </item>
                     <item>
                        <name>isTemplate</name>
                        <value>false</value>
                     </item>
                     <item>
                        <name>name</name>
                        <value>FreeNAS</value>
                     </item>
                     <item>
                        <name>connectionState</name>
                        <value>connected</value>
                     </item>
                     <item>
                        <name>state</name>
                        <value>poweredOff</value>
                     </item>
                     <item>
                        <name>vimHost</name>
                        <value>https://vc.demo.local:443/sdk</value>
                     </item>
                     <item>
                        <name>id</name>
                        <value>vm-37</value>
                     </item>
                     <item>
                        <name>dunesId</name>
                        <value>vc.demo.local/vm-37</value>
                     </item>
                  </properties>
                  <dunesUri>dunes://service.dunes.ch/CustomSDKObject?id='vc.demo.local/vm-37'&amp;dunesName='VC:VirtualMachine'</dunesUri>
               </item>
               <item>
   ...
               </item>
            </elements>
         </findReturn>
      </findResponse>
   </soapenv:Body>
</soapenv:Envelope>

2 个答案:

答案 0 :(得分:0)

您可以选择您可能要查询的几个关键属性(名称,ID,类型),然后将其余的XML存储为clob或varchar,或者如果您的数据库支持它,则将其作为本机XML类型存储。他们可以在需要时从代码中读取其他值。

答案 1 :(得分:0)

我使用nokogiri gem来解析xml。使用nokogiri,您可以调用xpath来获取具有特定父标记的所有元素。例如,使用你的xml:

     your_Model = Your_Model.new
     docs = Nokogiri::XML(your.xml)

     your_Model =  docs.xpath('//item').map do |i|
          {    
                #here you would need to map the objects of the xml to your model attributes so if your attributes were called, itemname, and itemvalue the code would be.
                   itemname => i.xpath('name').inner_text,
                   itemvalue => i.xpath('value').inner_text

          }
      your_Model.save!

如果你决定走这条路,请确保你需要Nokogiri宝石。

希望有所帮助