我正在通过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'&dunesName='VC:VirtualMachine'</dunesUri>
</item>
<item>
...
</item>
</elements>
</findReturn>
</findResponse>
</soapenv:Body>
</soapenv:Envelope>
答案 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宝石。
希望有所帮助