2015-05-20 125 views
0

我正在使用元素樹來解析API調用的以下結果。使用ElementTree解析XML API結果

<response status="success" code="19"> 
<result total-count="1" count="1"> 
    <users> 
     <entry name="admin"> 
      <phash>$$$$$</phash> 
      <permissions> 
       <role-based> 
        <superuser>yes</superuser> 
       </role-based> 
      </permissions> 
     </entry> 
     <entry name="tester"> 
      <permissions> 
       <role-based> 
        <superuser>yes</superuser> 
       </role-based> 
      </permissions> 
      <phash>$$$$$</phash> 
     </entry> 
    </users> 
</result> 

我想簡單地打印的用戶名是條目的屬性。我正在使用下面的代碼來解析這個。

def BP01002(ip, apikey): 
    xpath = "/config/mgt-config/users" 
    rulequery = {'type': 'config', 'action': 'get', 'key': apikey, 'xpath': xpath} 
    rrule = requests.get('https://' + ip + '/api', params = rulequery, verify=False) 
    rresp = ET.fromstring(rrule.text) 
    user = rresp.findall("./result/users") 
    print user 

如果我只是執行一個打印用戶,我會得到以下回應,我期望。

[<Element entry at 6ffff0948c0>, <Element entry at 6ffff094a28>] 

如果我嘗試用user.text或user.attrib打印結果的文本,我得到以下錯誤。

AttributeError: 'list' object has no attribute 'text' 

如何才能取得條目名稱的文本數據?

回答

0

findall返回一個列表。如果你要打印的element.text,你會需要像

[u.text for u in rresp.findall('users')] 

然而,這隻會<users>後打印換行符。 我懷疑,你可能想要的是更多的東西一樣

>>> [e.attrib for e in rresp.findall('users/entry')] 
[{'name': 'admin'}, {'name': 'tester'}] 

只要是完整的,element.text返回文本節點元素的開始和結束標籤中的文本,就像

<element>sometext</element> 

或「sometext」。如果你的元素不是文本節點,它將返回換行符或元素和下一個節點之間的任何內容。

<element> 
    <child> 
    </child> 
</element> 

在上面的示例中,對於節點子元素或元素,文本將返回一個換行符。

+1

就是這樣......謝謝! –