2015-05-20 2 views
0

Я использую дерево элементов, чтобы проанализировать следующий результат вызова API.Анализ результатов API XML с помощью ElementTree

<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

Это было ... Спасибо !!! –

Смежные вопросы