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

2024-09-30 12:12:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有多棵树,每棵树的结构看起来都不一样

我试图实现的是找到所有带有“序列号”标签的孩子,他们的“级别”是什么,他们的父母“序列号”是谁

例如,使用以下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

我的第一个想法是尝试并实现某种递归函数,但我很难理解为使其工作而必须设置的逻辑。有没有其他人做过类似的事情,或者知道如何正确实现这个递归函数


Tags: namenumberdataserial标签product结构document
1条回答
网友
1楼 · 发布于 2024-09-30 12:12:21

我不得不对提供的XML做一些更改(因为它是无效的XML),标记中有空格,拼写不匹配;但是,如果没有其他内容,那么以下内容应该为您提供一个起点(更改后的XML如下所示):

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

相关问题 更多 >

    热门问题