如何递归地查找ElementTree中的所有相似标签及其级别?

问题描述 投票:1回答:1

我有多棵树,每个树结构看起来都不同。

[我要实现的目标是找到所有带有标签“序列号”的孩子,他们的“级别”是什么,以及他们的父母“序列号”是谁。

例如,具有以下XML

  **<?xml version="1.0"?>
<data>
    <Product Name="Product A">
        <Country>US</Country>
        <Year>2009</year>
        <Serial Number>AB102</Serial Number>
        <Document>
            <Country>US</Country>
            <Serial Number>BB103</SerialNumber>
        </Document>
        <Document>
            <Country>IA</Country>
            <Serial Number>CC102</Serial Number>
                 <Document>
                     <Serial Number>DD102</Serial Number>
                 </Document>
        </Document>
   </Product Name>
</data> 

我想获取

Serial Number | Parent Serial Number | Level
   AB102             root                0 
   BB103             AB102               1   
   CC102             AB102               1  
   DD102             CC102               2

我的第一个想法是尝试实现某种递归函数,但是我很难理解必须设置的逻辑才能使其起作用。是否有其他人做过类似的事情或知道如何正确实现此递归函数?

python recursion xml-parsing elementtree
1个回答
0
投票
XML(example.xml内容)

<?xml version="1.0"?> <data> <ProductName Name="Product A"> <Country>US</Country> <Year>2009</Year> <SerialNumber>AB102</SerialNumber> <Document> <Country>US</Country> <SerialNumber>BB103</SerialNumber> </Document> <Document> <Country>IA</Country> <SerialNumber>CC102</SerialNumber> <Document> <SerialNumber>DD102</SerialNumber> </Document> </Document> </ProductName> </data>

代码

import xml.etree.ElementTree as ET

tree = ET.parse('example.xml')
root = tree.getroot()

def process_children(tree_in, parent_name, depth):
    next_depth = depth + 1
    for c in list(tree_in):
        if(c.tag == 'SerialNumber'):
            print('{0} | {1} | {2}'.format(c.text, parent_name, depth))
            parent_name = c.text
        process_children(c, parent_name, next_depth)

process_children(root, 'root', -1)

结果

AB102 | root  | 0
BB103 | AB102 | 1
CC102 | AB102 | 1
DD102 | CC102 | 2
© www.soinside.com 2019 - 2024. All rights reserved.