我正在尝试解析从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解析器从不在标签下输出任何内容。
最佳答案
解决了***
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