【问题标题】:XML processing script only lists one element but there are multiple elements to listXML 处理脚本只列出一个元素,但要列出多个元素
【发布时间】:2021-01-01 03:50:02
【问题描述】:

我编写了一个简单的 Python 脚本来打印所有与父元素属性关联的包名称的 XML 数据:Security Advisory

import xml.etree.ElementTree as ET
tree = ET.parse('errata.xml')
root = tree.getroot()
for security in root.findall("*[@type='Security Advisory']"):
    packages = security.find('packages')
    print(packages.text)

XML 数据位于here

然而,脚本只打印出第一个包名,但有多个包名。我将如何获取所有属于父属性的包名称:Security Advisory

【问题讨论】:

  • 也许你找到findall而不是find
  • @larsks 改变了这个:packages = security.findall('packages') 收到这个错误:print(packages.text) AttributeError: 'list' object has没有属性“文本”
  • 没错。因为现在你得到的是一个 list 而不是单个项目,当然。

标签: python xml elementtree


【解决方案1】:

在下面(似乎有效)

import xml.etree.ElementTree as ET

import requests

r = requests.get('https://cefs.b-cdn.net/6010e333a44911e24b5112e23acbb346ae15f7b7/errata.latest.xml')
if r.status_code == 200:
    root = ET.fromstring(r.content)
    sec_elements = [e for e in root.findall("*[@type='Security Advisory']") if
                    e.find('os_release') is not None and int(e.find('os_release').text) > 6]
    for ele in sec_elements:
        packages = ele.findall('./packages')
        for p in packages:
            print(p.text)

【讨论】:

  • 谢谢你!这要好得多,因为它直接提取 XML。你为什么使用:('./packages') 而不是:('packages')
  • @alteredstate 我认为两者应该是一样的,所以我对此没有很好的解释......
  • 是否可以更进一步,根据'Security Advisory' 以及:os_release 元素文本打印出包裹列表?这是 XML 的一个小示例:<CEBA-2020--0749> <os_arch>i686</os_arch> <os_arch>x86_64</os_arch> <os_release>6</os_release> <packages>nfs-utils-1.2.3-78.el6_10.2.i686.rpm</packages> <packages>nfs-utils-1.2.3-78.el6_10.2.src.rpm</packages> <packages>nfs-utils-1.2.3-78.el6_10.2.x86_64.rpm</packages> </CEBA-2020--0749>
  • 你想要什么?如果 CEBA 元素的类型为 @type='Security Advisory' 并且 os_release 元素具有特定值,是否要查找这些包?试着澄清一下。
  • 是的,没错!根据 @type='Security Advisory'(正如我们所做的那样)和 os_release 打印出软件包列表 > 6.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
  • 1970-01-01
  • 2018-01-09
  • 2017-03-23
相关资源
最近更新 更多