如何递归查找 ElementTree 中所有相似的标签及其级别?
How to recursively find all similar tags in an ElementTree and also their level?
我有多棵树,每棵树的结构看起来都不一样。
我想要实现的是找到所有带有标签 "Serial Number" 的 children 以及他们的 "level" 是什么以及他们的 parent "Serial Number"是。
例如下面的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
我的第一个想法是尝试实现某种递归函数,但我很难理解我必须 set-up 使其工作的逻辑。有没有其他人做过类似的事情或者知道如何正确实现这个递归函数?
我不得不对提供的 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
我有多棵树,每棵树的结构看起来都不一样。
我想要实现的是找到所有带有标签 "Serial Number" 的 children 以及他们的 "level" 是什么以及他们的 parent "Serial Number"是。
例如下面的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
我的第一个想法是尝试实现某种递归函数,但我很难理解我必须 set-up 使其工作的逻辑。有没有其他人做过类似的事情或者知道如何正确实现这个递归函数?
我不得不对提供的 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