2

Python と xml.dom.minidom を使用して、エクスポートされた Excel スプレッドシートを反復処理し、.write へのさまざまな呼び出しを使用して食堂メニューの HTML テーブルを出力しています。問題は、Excel が出力する XML が構造化されていないことです。これを補うために、テスト対象の nodeValue を持つ子ノードに遭遇したときに設定される変数 (day、previousDay、meal など) をいくつか設定しました。新しいテーブルをいつ開始するか (曜日ごとに)、または新しい行をいつ開始するか (day != previousDay の場合) などを決定するための if ステートメントがたくさんあります。

ただし、特定のノードを無視する方法を理解するのは困難です。無視する必要がある Excel からの出力を取得するノードがいくつかあります。特定の値を持つ子ノードに基づいてこれを行うことができますが、それを実装する方法がわかりません。

基本的に、メインの for ループに次の if ステートメントが必要です。

for node in dome.getElementsByTagName('data'):  
    if node contains childNode with nodeValue == 'test':
        do something
4

3 に答える 3

0

私の簡単な傾向は、次のような get-out-of-node-free-card (ええと、例外) を持つネストされた for ループを持つことです。

Class BadNodeException (Exception):
pass
for node in dome.getElementsByTagName('data'):
try:  
    for child in node.childNodes:
        if child.nodeValue == 'test':
           raise BadNodeException
    ## process node as normal
except BadNodeException:
    pass
于 2011-04-07T17:44:03.133 に答える
0

代わりに SAX パーサーを使用することを検討しましたか? Sax パーサーは、XML ツリー構造をノードの出現順 (深さ優先) に処理し、解析時点でノード値を処理できるようにします。

xml.sax.XmlReader

于 2011-08-18T18:50:10.363 に答える
0

使用する必要がありますxml.dom.minidomか? これは、XPath が得意とする種類のものだからです。たとえば、を使用するlxml.etreeと、必要なすべての要素が見つかります。

my_elements = document.xpath("//data[not(*[.='test'])]")

W3C の DOM は、要素の値を返す属性などの単純なものが含まれていないため、実際の問題に使用するのは非常に困難です。(XPath は、要素の値が、連結されたすべての子テキスト ノードであることを宣言します。これが、上記のパターンが機能する理由です。)

そのようなことのためにヘルパー関数を実装する必要があります。

def element_text(e):
  return "".join(t.nodeValue for t in e.childNodes if t.nodeType == Node.TEXT_NODE)

これにより、フィルター関数を簡単に作成できます。たとえば、次のようになります。

def element_is_of_interest(e):
   return not any((c for c in e.childNodes if element_text(c) == "test"))

次のように要素を取得します。

my_elements = filter(element_is_of_interest, d.getElementsByTagName("data"))
于 2011-04-07T18:59:36.423 に答える