2012-04-03 8 views
0

私はXMLから式を作成しようとしています。トップノードからの読み込みスタックにノードを1つずつ入れたいのですが、終了タグを押すと、スタックのすべての要素がポップされます。タグの終わりをチェックするには?minidomを使ってPythonでタグの終わりをチェックする方法は?

TIA、

ジョン

回答:

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) 

「サブノードリターン'それは終わりのタグを打つ!

ありがとうございました!

答えて

1

minidomはDOM全体をメモリに構築します。したがって、終了タグが発​​生したときに通知しません。

1)swtichをhttp://docs.python.org/library/pyexpat.htmlとみなし、xmlparser.EndElementHandlerを使用して終了タグを監視します。また、StartElementHandlerを使用してスタックを構築する必要があります。

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

+0

残念ながら、これは継承されたプロジェクトです。私は他のモジュールに変更することはできません。 2)XML形式は静的形式を持たず、任意の繰り返し形式にすることができます。 – JohnX

+0

@JohnXそうなら、あなたはこれをチェックしたいかもしれません:http://stackoverflow.com/questions/1596829/xml-parsing-with-python-and-minidom –

+0

ありがとうAnthony !.私は解決策を含めるために投稿を編集しました。 – JohnX

1

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

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

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

すべて子供(ノードの子供の子供などを含む)の場合、再帰的解決法は最も簡単です。

+0

ええ、libXml XML_ELEMENT_DECLのようなものがあると思っていましたが、とにかく解決策を見つけたと思います。ありがとうKindall !. – JohnX

関連する問題