0

我正在通过 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>
4

2 回答 2

0

您可以挑选出您可能想要查询的几个关键属性(名称、id、类型),然后将其余的 XML 存储为 clob 或 varchar 或本地 XML 类型(如果您的数据库支持)。他们可以在需要时在代码中读取其他值。

于 2012-07-12T05:57:33.763 回答
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 宝石。

希望能帮助到你

于 2012-07-12T15:03:38.873 回答