Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.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 如何递归地查找ElementTree中的所有相似标记及其级别?_Python_Recursion_Xml Parsing_Elementtree - Fatal编程技术网

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

Python 如何递归地查找ElementTree中的所有相似标记及其级别?,python,recursion,xml-parsing,elementtree,Python,Recursion,Xml Parsing,Elementtree,我有多棵树,每棵树的结构看起来都不一样 我试图实现的是找到所有带有“序列号”标签的孩子,他们的“级别”是什么,他们的父母“序列号”是谁 例如,使用以下XML **<?xml version="1.0"?> <data> <Product Name="Product A"> <Country>US</Country> <Year>2009</year> &

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

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

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

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

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

XML(example.XML内容)

美国
2009
AB102
美国
BB103
IA
CC102
DD102
代码
将xml.etree.ElementTree作为ET导入
tree=ET.parse('example.xml')
root=tree.getroot()
def process_子项(树中、父项名称、深度):
下一个深度=深度+1
对于列表中的c(树中):
如果(c.tag=='SerialNumber'):
打印({0}{1}{2})。格式(c.text,父项名称,深度)
父项名称=c.text
进程\u子级(c、父级\u名称、下一级\u深度)
进程_子级(根,'root',-1)
结果
嗨,这看起来很有希望。只有一个问题,当我有一个“SerialNumber”标记作为root的子级时,我将如何处理这种情况?我有一些这样的案例,但是这个脚本忽略了。
Serial Number | Parent Serial Number | Level
   AB102             root                0 
   BB103             AB102               1   
   CC102             AB102               1  
   DD102             CC102               2
AB102 | root  | 0
BB103 | AB102 | 1
CC102 | AB102 | 1
DD102 | CC102 | 2