2011-07-20 17 views
5

特定のディレクトリに一連のXMLを含むディレクトリを開こうとしています。
次のコードでは、各XMLドキュメントを繰り返し処理しています。XMLのテキストを読み込み、キーワードを見つけて置き換えて、新しい場所に新しいファイルを書き込むためのif文を設定します。
私は、スクリプトを実行したときに、私は次のエラーを取得しています:タイプ 'NoneType'の引数は反復可能ではありません

Traceback info: 
    File "Z:\ESRI\Python\Test Scripts\ElementTree6.py", line 62, in <module> 
    if "%begdate%" in element.text: 
     ... 

エラー情報:

argument of type 'NoneType' is not iterable 

を私はハード一つの特定のXMLへのディレクトリをコード化していると私はif文を介して実行する場合、彼らはうまく動作します。
エラーが発生した一連のXMLを反復処理するように設定しようとしています。
私は最終的な解決策があるかどうかを調べるためにこのサイトを検索しましたが、すべての問題が私のものと異なるか、回避策を十分に理解していません。

私は出力をテストするためにいくつかの印刷行を使用しました。
if文に到達してからエラーが発生するまでは、すべて正常に動作します。

# Location of XML's 
folderPath = r"Z:\data" 

# set variable to store files with extension ".xml" 
for filename in glob.glob(os.path.join(folderPath, "*.xml")): 

fullpath = os.path.join(folderPath, filename) 

# find files and split the filename from the directory path 
if os.path.isfile(fullpath): 
    basename, filename2 = os.path.split(fullpath) 
    #print "Basename = " + basename 
    #print "Filename = " + filename2 

    # set variable to store XML structure from xml file 
    root = ElementTree(file=r"Z:\data\\" + filename2) 


    #Create an iterator 
    iter = root.getiterator() 
    #Iterate 
    for element in iter: 
     #print element.text 

      if "%begdate%" in element.text: 
      BEGDATE = element.text.replace("%begdate%", BEGDATEPARAM) 
      element.text = BEGDATE 
+1

これは書かれたとおりにはコンパイルされません - 問題の行がコメントアウトされた 'print element.text'と一列に並んだ、左4桁であると思います。あなたはこれをコメントアウトしたときに何を見たのですか? –

答えて

19

xmlドキュメントには、文字データ(テキスト)が含まれていない要素が多数あることがわかります。 pythonについての素晴らしいことの一つは、どれも条件付きで偽でないということである短絡があなたの問題には本当に簡単な解決策があることを意味し、行をどのように変化するかを条件文の知識を持っていることをカップリング:

if "%begdate%" in element.text: 

に:

if element.text and "%begdate%" in element.text: 

テキストがありません、そしてelement.textはなし、別名Fa​​lseでない、そしてあなたも、エラーの原因となっている条件の一部を取得することはできません。

+3

+1:element.textがNoneでなく、element.text: 'の中で"%begdate% "であればさらに良いでしょう。 – jathanism

+0

みんなありがとう。これは私の問題を解決しました。私は投票するだろうが、明らかに私はここで十分に強い評判を持っていない。皆様からの迅速な返信に感謝します! – Mike

1

このエラーは、反復処理中のタグの1つにテキストが含まれていないことを示しています。
私はそのチェックを行うには良い方法は、次のいずれかを持つif文という置き換えることであろうと思う:

if "%begdate%" == element.text: 
    #code goes here... 

import re 
if re.search("%begdate%", element.text): 
    #code goes here... 

平等のための最初の例をチェックし、第二のタグはあなたが含まれているかどうかを確認するためにregular expressionを使用しています文字列。私は、正規表現がNoneの検索スペースをどのように処理するのかよく分かりません。

関連する問題