Python XML Parsing无法找到孩子的孩子

时间:2014-12-01 18:15:39

标签: python xml rest vcloud-director-rest-api

我试图解析从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>

python代码:

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链接,它本质上是VM的容器。我需要在每个vApp下获取VM链接。第一个将选择vApp链接并查询它们。

一旦它在vApp链接上执行get请求,它就会获得下一级XML数据,这是我上面提到的结构。所以它传递初始XML语句并返回vApp信息。

即使我打印出每个child.attrib fom vmlinkXML,与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解析器永远不会在标记下输出任何内容。

1 个答案:

答案 0 :(得分: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