使用 ElementTree 解析 XML API 结果

Parsing XML API Result Using ElementTree

我正在使用 Element Tree 来解析 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'

如何只提取条目名称文本数据?

查找所有 returns 列表。如果你想打印 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 return 是文本节点元素的开始和结束标签内的文本,例如

<element>sometext</element>

或"sometext"。如果您的元素不是文本节点,它将 return 换行符或元素和下一个节点之间的任何内容。

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

在上面的示例中,对于节点子节点或元素,文本将 return 一个换行符。