1

我正在尝试解析从 http get 请求返回为字符串的 XML。我需要在 XML 结构中获取特定链接,但由于某种原因,我无法访问我需要的链接。我尝试**enumerating**了 XML 和打印child.attrib,但我需要的链接没有显示。

我需要找到一个子元素,并且该元素称为 Vm,然后我需要获取该元素的 .attrib。

因此,我做了更多的研究并尝试通过节点名称找到我需要的 XML

XML 结构为:

<vapp>
   <link></link>
   <othertags></othertags>
   <Children>
      <Vm href='link I need'>
      <other tag options>
      </other tag options>
      </vm>
   </Children>
</vapp>

蟒蛇代码:

for i, child in enumerate(vappXML):
   if 'href' in child.attrib and 'name' in child.attrib:
      vapp_url =  child.attrib['href']

      r=requests.get(vapp_url, headers = new_headers)
      vmlinkXML = fromstring(r.content)

      for VM in vmlinkXML.findall('Children'):
         print VM

      for i, child in enumerate(vmlinkXML):
         if 'vm-' in child:
            print child.attrib

         if 'href' in child.attrib:
            vm_url =  child.attrib['href']
            if 'vm-' in vm_url:
               print vm_url

无论我如何尝试,我都无法访问该网址。我只得到 vApp 的主要孩子,它从不解析标签,或者我的代码永远不会比 vapp 的第一个孩子更进一步,我不知道为什么。

我想我不是很清楚。我正在解析作为字符串返回的 vCloud Director Rest API XML。第一层是 vApp 链接,它本质上是一个虚拟机容器。我需要获取每个 vApp 下的 VM 链接。第一个将选择 vApp 链接并查询它们。

一旦它在 vApp 链接上发出 get 请求,它就会获得下一级 XML 数据,这是我在上面放置的结构。因此它传递初始 XML 语句并返回 vApp 信息。

即使我打印出 vmlinkXML 中的每个 child.attrib ,与 vm 的链接也不会被打印出来。但是,如果我只打印 r.content 链接就在那里。它几乎就像 XML 解析器看不到标签一样。

我正在使用 Pythons XML.etree

from lxml import etree
from xml.etree.ElementTree import XML, fromstring, tostring

所以要明确的结构是:

要获取 vApp 链接 /api/admin/extension/vapps/query,则返回的信息将包含指向 vCloud 中每个 vapp 的链接。然后我调用 vApp 链接 https://vcloud.test.co/api/vApp/vapp-3b4980e7-c5ab-4462-9cfe-abc6292c15748 它将返回类似于此的结构:

<vapp>
   <link></link>
   <othertags></othertags>
   <Children>
      <Vm href='link I need'>
      <other tag options>
      </other tag options>
      </vm>
   </Children>
</vapp>

标签包含我需要查询的下一级链接。然而,带有 child.attrib 的 XML 解析器永远不会在标记下输出任何内容。

4

1 回答 1

1

解决了***

r=requests.get(url + '/api/admin/extension/vapps/query', headers = new_headers)
vappXML = fromstring(r.content)
for i, child in enumerate(vappXML):
   if 'href' in child.attrib and 'name' in child.attrib:
      vapp_url =  child.attrib['href']

      r=requests.get(vapp_url, headers = new_headers)
      DOMTree = parseString(r.content)
      vmElements = DOMTree.documentElement      
      VMS = vmElements.getElementsByTagName("Vm")

      for vm in VMS:
         if vm.hasAttribute("href"):
            vm_link = vm.getAttribute("href")
            print vm_link
于 2014-12-01T21:38:06.357 回答