Python (2.6) 的 ElementTree 的标准实现不提供从子节点指向父节点的指针。因此,如果需要父母,建议循环父母而不是孩子。
考虑我的 xml 的形式:
<Content>
<Para>first</Para>
<Table><Para>second</Para></Table>
<Para>third</Para>
</Content>
以下查找所有“Para”节点而不考虑父节点:
(1) paras = [p for p in page.getiterator("Para")]
这(改编自 effbot)通过循环而不是子节点来存储父节点:
(2) paras = [(c,p) for p in page.getiterator() for c in p]
这是非常有意义的,并且可以通过条件扩展以实现与(1)相同的结果,但添加了父信息:
(3) paras = [(c,p) for p in page.getiterator() for c in p if c.tag == "Para"]
ElementTree 文档建议 getiterator() 方法进行深度优先搜索。在不寻找父级 (1) 的情况下运行它会产生:
first
second
third
但是,从 (3) 中的 paras 中提取文本会产生:
first, Content>Para
third, Content>Para
second, Table>Para
这似乎是广度优先。
因此,这提出了两个问题。
- 这是正确和预期的行为吗?
- 当孩子必须是某种类型但父母可以是任何东西时,如果必须保持文档顺序,你如何提取(父母,孩子)元组。我不认为运行两个循环并将(3)生成的(父,子)映射到(1)生成的订单是理想的。