ElementTree for Python(2.6)の標準実装では、子ノードからの親へのポインタは提供されません。したがって、両親が必要な場合は、子どもではなく親をループすることが推奨されます。Pythonを使用して複数の(親、子)ノードを反復するElementTree
私の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)のような、しかし親情報と(おそらく)同じ結果を達成するために、条件付きDが追加:
(3) paras = [(c,p) for p in page.getiterator() for c in p if c.tag == "Para"]
をElementTree documentation getiterator()メソッドは、深さ優先探索を行うことを示唆しています。親(1)利回りを探しせずにそれを実行:
first
second
third
はしかし、(3)でパラスからテキストを抽出し、利回り:
first, Content>Para
third, Content>Para
second, Table>Para
これは、幅優先ように見えます。
したがって、2つの質問が発生します。
- これは間違いありませんか?
- 子が特定のタイプでなければならないが、親が何でもかまいません()場合、どのように(親、子)タプルを抽出しますか?。私は2つのループを実行し、(3)で生成された(親、子)を(1)によって生成されたオーダーにマッピングすることは理想的ではないと思います。
は、このソリューションをありがとうございました。 =) – mmmdreg