2014-12-01 59 views
1

我试图解析从http获取请求作为字符串返回的XML。我需要在XML结构中获得特定的链接,但由于某种原因,我无法访问我需要的链接。 我试过**enumerating** XML和打印child.attrib但我需要的链接不显示。Python XML解析找不到儿童的孩子

我需要找到一个元素是一个孩子的孩子,这个元素叫做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链接,它本质上是虚拟机的容器。我需要获取每个vApp下的VM链接。第一个将选择vApp链接并查询它们。

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

即使当我打印出每个child.attrib fom vmlinkXML与vm的链接都不会被打印出来。然而,如果我只是打印r.content链接在那里。它几乎就像XML解析器没有看到标签。

我使用蟒蛇XML.etree

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

所以要清楚的结构是:

得到vApp的链接/ API /管理/推广/ vApp的/查询 然后返回的信息将包含指向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解析器从不输出标签下的任何内容。

+0

'如果child.attrib“HREF”和“名”在child.attrib:' - 没有顶层标签有一种属性(少得多的两个他们)。你永远不会过去这里。 – tdelaney 2014-12-01 19:02:06

+0

您使用哪种xml解析器?像“Children/Vm/@ href”这样的xpath表达式可能会给你想要的东西。 – tdelaney 2014-12-01 19:04:16

+0

@tdelaney为你增加了更多的清晰度 – 2014-12-01 20:55:52

回答

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