ElementTree for Python(2.6)の標準実装では、子ノードから親へのポインターは提供されません。したがって、親が必要な場合は、子ではなく親をループすることをお勧めします。
私のxmlが次の形式であると考えてください。
<Content>
<Para>first</Para>
<Table><Para>second</Para></Table>
<Para>third</Para>
</Content>
以下は、親を考慮せずにすべての「パラ」ノードを検索します。
(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)のパラグラフからテキストを抽出すると、次のようになります。
first, Content>Para
third, Content>Para
second, Table>Para
これは幅優先のようです。
したがって、これは2つの疑問を提起します。
- これは正しく、期待される動作ですか?
- 子が特定のタイプである必要があるが、ドキュメントの順序を維持する必要がある場合、親は何でもかまいませんが、(親、子)タプルをどのように抽出しますか。2つのループを実行し、(3)によって生成された(親、子)を(1)によって生成された順序にマッピングすることは理想的ではないと思います。