【问题标题】:How to Iterate through XML tree children from chosen parent?如何从选定的父级遍历 XML 树子级?
【发布时间】:2020-02-25 22:57:52
【问题描述】:

我想遍历我的 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')

【问题讨论】:

    标签: python python-3.x xml xml-parsing


    【解决方案1】:

    您的实施效率非常低。随着 XML 中元素的增长,使用五个循环会大大增加运行时间。换句话说,O(n^5) 简直太糟糕了。

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

    import xml.etree.ElementTree as ET
    root = ET.parse(filename)
    result = ''
    
    for elem in root.findall('.//child/grandchild'):
        if elem.attrib.get('name') == 'foo':
            result = elem.text
            break
    

    你可以把同样的想法融入你的函数中,然后把它变成类似的东西

    def data_dump(element,value):
        for elem in root.findall('.//parent/'+element):
            if elem.attrib.get('name') == value:
                text,attrib,tag = elem.text,elem.attrib,elem.tag
                break
    
    

    【讨论】:

    • 我也意识到我正在解析的 xml 文件在每个标签前面都有一个命名空间,这在 findall 中也是必需的。
    猜你喜欢
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多