【问题标题】:How to recursively find all similar tags in an ElementTree and also their level?如何递归地查找 ElementTree 中的所有相似标签及其级别?
【发布时间】:2019-12-03 12:59:02
【问题描述】:

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

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

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

    我不得不对提供的 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
    

    【讨论】:

    • 嗨,这看起来很有希望。只有一个问题,当我有一个“SerialNumber”标签作为根的孩子时,我将如何处理这种情况?我有一些这样的情况,然后这个脚本就漏掉了。
    猜你喜欢
    • 2011-09-10
    • 2012-09-06
    • 2017-09-13
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    • 2018-03-30
    • 2010-11-02
    • 2015-07-17
    相关资源
    最近更新 更多