【问题标题】:how to iterate through every element of a complicated XML tree如何遍历复杂 XML 树的每个元素
【发布时间】:2013-06-26 02:38:42
【问题描述】:

我已经这样声明了一个根:

root = ET.fromstring(xml_data)

假设我有一个看起来像这样的 XML 代码

<a>
    <b>
        <c>
            <d>
                <e>
                    ...
                </e>
            </d>
        </c>
    </b>
</a>

我不太清楚如何遍历元素树中的每个元素。

我想过做:

while (True)
    for child in root
        print child.tag

但这最终得到了这个无限的输出:

a
a
a
a
a

只是为了让您了解我正在尝试做什么,我传递了两个 XML 代码,一个是相当大且复杂的 XML 代码,另一个只是一个简单的 XML 代码。 我需要找出大型 XML 代码中有多少匹配的 XML。

因此,我需要遍历大 XML 中的每个元素,并将其与每个小的 XML 元素进行比较。

任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: python xml elementtree


    【解决方案1】:

    任何解决方案都是递归的

    process_node(node n)
        do something with n.text if present
        for child in n.children
            process_node(child)
    

    在顶层

    process_node(root)
    

    根据需要添加对节点名称的测试以自定义处理。

    【讨论】:

    • 谢谢。这是一个非常简单的代码,但递归是唯一的方法吗?如果我可以使用递归来做到这一点,那么我必须能够使用循环来做到这一点,对吧?因为程序的效率对于这个项目很重要。
    • 另外,难道没有内置的库函数可以用来执行此操作吗?我正在查找图书馆,但还不太确定。
    • 我不懂 Python,但如果递归效率低下,那么我严重怀疑该语言会像现在这样流行。是什么让您认为您可以比编译器更好地将递归算法转换为循环?
    • @Michael Kay,感谢您的回复。我仍在试图弄清楚,但我不愿意在我的程序中使用递归,因为这会重新启动其中的所有变量,而且据我所知,它占用了大量内存。它可能使我的代码更简洁,但可能效率不高。
    • 我认为你误解了递归。它不会“重新启动所有变量”。关于递归的完整教程超出了 SO 的范围,但在这种情况下,与您的同事进行一些研究和咨询将非常值得您花时间。递归起初可能看起来很可怕,但它是一般计算的大部分的基础。一些问题,比如计算斐波那契数,是递归定义的,但线性实现要好得多。然而,也有整个类的问题,递归是最好的解决方案。这是其中之一。
    猜你喜欢
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 2021-07-29
    • 1970-01-01
    相关资源
    最近更新 更多