0

XML から式を作成しようとしています。最上位ノードから読み取る ノードを 1 つずつスタックに入れたいと思います。終了タグにヒットしたら、スタック内のすべての要素をポップしたいと思います。タグの末尾を確認するにはどうすればよいですか?.

ティア、

ジョン

答え:

OK、次のような再帰関数を使用して、解決策があると思います。

def findTextNodes(nodeList):
    for subnode in nodeList:
        if subnode.nodeType == subnode.ELEMENT_NODE:
            print("element node: ",subnode.tagName)
            # call function again to get children
            findTextNodes(subnode.childNodes)
            print('subnode return: ', subnode.tagName)
        elif subnode.nodeType == subnode.TEXT_NODE:
            print("text node: ",subnode.data)

「サブノードが戻る」ときは、終了タグにヒットします!.

みんなありがとう!

4

2 に答える 2

1

minidomDOM を構築します。XML はノードに完全に解析されているため、DOM にはタグがありません。DOM 内のノードは、XML 要素全体を表します。

あなたが望むように聞こえるのは、単にノードの子 (またはタイプの子ELEMENT_NODE) です。

それらをスタックにプッシュしたり、スタックからポップしたりすることについて話しているので、ドキュメントに表示される順序とは逆にする必要があるように思えます。その場合、おそらく次のようなものが必要ですreversed([child for child in node.childNodes if child.nodeType == child.ELEMENT_NODE])

すべての子 (ノードの子の子などを含む) が必要な場合は、再帰的なソリューションが最も簡単です。

于 2012-04-03T20:35:29.110 に答える
1

minidom はメモリ内に DOM 全体を構築します。したがって、終了タグが検出されたときに通知されません

1) http://docs.python.org/library/pyexpat.htmlへの切り替えを検討し、xmlparser.EndElementHandler を使用して終了タグを監視することができます。また、StartElementHandler を使用してスタックを構築する必要があります。

2) minidom が生成する DOM ツリーを利用します。そこからノードを選択するだけです。(スタックを使用せずに)

于 2012-04-03T20:09:36.283 に答える