Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python XML处理脚本只列出一个元素,但要列出多个元素_Python_Xml_Elementtree - Fatal编程技术网

Python XML处理脚本只列出一个元素,但要列出多个元素

Python XML处理脚本只列出一个元素,但要列出多个元素,python,xml,elementtree,Python,Xml,Elementtree,我编写了一个简单的Python脚本,用于打印与父元素属性关联的所有包名的XML数据:Security advision 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('p

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

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数据位于

但是,脚本只打印出第一个包名,但有多个包名。我如何获取属于父属性的所有包名:
安全建议?

下面(似乎有效)


也许你找到了
findall
而不是
find
?@larsks更改了这个:packages=security。findall('packages')收到了这个错误:print(packages.text)AttributeError:'list'对象没有正确的属性'text'。当然,因为现在你得到的是一个列表而不是一个项目。谢谢你!这是更好的,因为它直接提取XML。为什么您使用:('./packages')而不是:('packages')?@alteredstate我认为两者的工作原理应该相同,因此我没有很好的解释……是否可以更进一步,根据
'Security advision'
以及:
os\u release
元素文本打印包列表?以下是XML的一个小示例:
i686 x86_64 6 nfs-utils-1.2.3-78.el6_10.2.i686.rpm nfs-utils-1.2.3-78.el6_10.2.src.rpm nfs-utils-1.2.3-78.el6_10.2.x86_64.rpm
您想要什么?如果CEBA元素的类型为@type='Security advision',并且os_release元素具有特定的值,您想查找包吗?试着澄清一下。是的,没错!根据@type='Security advision'(如我们所做)和os_release>6打印包列表。
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)