Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.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_Python 3.x_Xml_Xml Parsing - Fatal编程技术网

Python 如何遍历所选父级的XML树子级?

Python 如何遍历所选父级的XML树子级?,python,python-3.x,xml,xml-parsing,Python,Python 3.x,Xml,Xml Parsing,我希望遍历我的XML树并从所选父级检索所有子级属性。这是我的解析设置: import xml.etree.ElementTree as ET file_name = 'myXML.xml' tree = ET.parse(file_name) root = tree.getroot() 我使用的函数使用for循环,但每一代的每一层都需要一个for循环: 本质上,每个父级循环遍历每个子级并返回.tag,.text,&.attrib: 有没有一种方法可以在不知道层数的情况下循环并收集所有这些数据

我希望遍历我的XML树并从所选父级检索所有子级属性。这是我的解析设置:

import xml.etree.ElementTree as ET

file_name = 'myXML.xml'
tree = ET.parse(file_name)
root = tree.getroot()
我使用的函数使用for循环,但每一代的每一层都需要一个for循环: 本质上,每个父级循环遍历每个子级并返回
.tag
.text
,&
.attrib

有没有一种方法可以在不知道层数的情况下循环并收集所有这些数据

def data_dump(k, mD, st):
    for na in mD.iter(k):
        for a in na:
            print(st + '> a:: ', a.tag., a.text, a.attrib)
            for b in a:
                print('|-->', ' b:: ', b.tag, b.text, b.attrib)
                for c in b:
                    print('|---->', ' c:: ', c.tag, c.text, c.attrib)
                    for d in c:
                        print('|------>', ' d:: ', d.tag, d.text, d.attrib)

以下是我的测试用例:

data_dump('Title', root, 'TITLE')
data_dump('Comment', root, 'COM')
data_dump('Steps', root, 'STEP')
data_dump('Transitions', root, 'TRANS')
data_dump('Branches', root, 'BRAN')
data_dump('Connections', root, 'CONN')
data_dump('Sequence', root, 'SEQ')

您的实现效率很低。随着XML中元素的增长,使用五个循环可能会大大增加运行时间。换句话说,O(n^5)是非常可怕的

对于您的问题,我建议您使用XPath,请阅读更多

将xml.etree.ElementTree作为ET导入
root=ET.parse(文件名)
结果=“”
对于root.findall(“.//子/孙”)中的元素:
如果elem.attrib.get('name')=='foo':
结果=元素文本
打破
您可以将相同的想法合并到函数中,并将其转化为

def数据转储(元素、值):
对于root.findall('.//parent/'+元素)中的元素:
如果elem.attrib.get('name')==值:
text,attrib,tag=elem.text,elem.attrib,elem.tag
打破

我也意识到,我正在解析的xml文件在每个标记前面都有一个名称空间,这也是
findall
中需要的。