2011-03-30 69 views
0

我正尝试使用缩小网站缩略图的Web服务。他们有一个API返回XML,告诉你是否可以创建站点缩略图。我正在尝试使用ElementTree解析xml,但不知道如何获取我需要的信息。这里是一个XML响应的例子:如何解析用ElementTree收缩web xml

<?xml version="1.0" encoding="UTF-8"?> 
<stw:ThumbnailResponse xmlns:stw="http://www.shrinktheweb.com/doc/stwresponse.xsd"> 
    <stw:Response> 
     <stw:ThumbnailResult> 
      <stw:Thumbnail Exists="false"></stw:Thumbnail> 
      <stw:Thumbnail Verified="false">fix_and_retry</stw:Thumbnail> 
     </stw:ThumbnailResult> 
     <stw:ResponseStatus> 
      <stw:StatusCode>Blank Detected</stw:StatusCode> 
     </stw:ResponseStatus> 
     <stw:ResponseTimestamp> 
      <stw:StatusCode></stw:StatusCode> 
     </stw:ResponseTimestamp> 
     <stw:ResponseCode> 
      <stw:StatusCode></stw:StatusCode> 
     </stw:ResponseCode> 
     <stw:CategoryCode> 
      <stw:StatusCode>none</stw:StatusCode> 
     </stw:CategoryCode> 
     <stw:Quota_Remaining> 
      <stw:StatusCode>1</stw:StatusCode> 
     </stw:Quota_Remaining> 
    </stw:Response> 
</stw:ThumbnailResponse> 

我需要得到“stw:StatusCode”。如果我尝试查找“stw:StatusCode”,则会出现“期望的路径分隔符”语法错误。有没有办法获得状态码?

+0

如果你表明你正在使用的代码... – 2011-03-30 01:45:40

回答

1

哎呀命名空间....试试这个:

STW_PREFIX = "{http://www.shrinktheweb.com/doc/stwresponse.xsd}" 

(见示例XML的2号线)

然后,当你想要一个像stw:StatusCode标签,使用STW_PREFIX + "StatusCode"

更新:该XML响应不是最出色的设计。从单个例子​​中不可能猜测是否可以有超过1个二级节点。请注意,每个第三级节点都有一个“StatusCode”子节点。下面是一些粗略和准备好的代码,它向您显示(1)为什么您需要STW_PREFIX caper(2)可用信息的摘录。

import xml.etree.cElementTree as et 
def showtag(elem): 
    return repr(elem.tag.rsplit("}")[1]) 
def showtext(elem): 
    return None if elem.text is None else repr(elem.text.strip()) 
root = et.fromstring(xml_response) # xml_response is your input string 
print repr(root.tag) # see exactly what tag is in the element 
for child in root[0]: 
    print showtag(child), showtext(child) 
    for gc in child: 
     print "...", showtag(gc), showtext(gc), gc.attrib 

结果:

'{http://www.shrinktheweb.com/doc/stwresponse.xsd}ThumbnailResponse' 
'ThumbnailResult' '' 
... 'Thumbnail' None {'Exists': 'false'} 
... 'Thumbnail' 'fix_and_retry' {'Verified': 'false'} 
'ResponseStatus' '' 
... 'StatusCode' 'Blank Detected' {} 
'ResponseTimestamp' '' 
... 'StatusCode' None {} 
'ResponseCode' '' 
... 'StatusCode' None {} 
'CategoryCode' '' 
... 'StatusCode' 'none' {} 
'Quota_Remaining' '' 
... 'StatusCode' '1' {} 
+0

在Python 2.7+,您可以使用register_namespace(HTTP它可以帮助://docs.python。 org/library/xml.etree.elementtree.html#xml.etree.ElementTree.register_namespace)来简化调用命名空间前缀的语法。 – 2011-03-30 02:43:57

+0

@Liza Daly:文档提到了序列化。它如何帮助解析现有的XML文档? – 2011-03-30 05:29:16