2011-07-20 13 views
5

Próbuję otworzyć katalog, który zawiera szereg XML w jednym określonym katalogu.
W poniższym kodzie, I iterating poprzez każdy dokument XML, a ja ustawienie niektórych "instrukcji if", aby odczytać tekst w XML, znaleźć słowa kluczowe i zastąpić je, a następnie napisz nowy plik do nowej lokalizacji.
otrzymuję następujący błąd podczas uruchamiania skryptu:Argument typu "NoneType" nie jest iterable

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

Error Info:

argument of type 'NoneType' is not iterable 

mam zakodowanego katalogu do jednego konkretnego XML i kiedy uruchomić poprzez if, działają dobrze.
To jest, gdy próbuję skonfigurować do iteracji poprzez serię XML-ów, które napotkam na błąd.
Przeszukałem tę stronę, aby sprawdzić, czy mogę rozwiązać rozwiązanie, ale wszystkie problemy są inne niż moje lub nie rozumiem w pełni tego, co się dzieje.

Użyłem wielu linii drukowania do testowania wyjść.
Wszystko działa poprawnie, dopóki nie dojdę do instrukcji if, a następnie pojawi się błąd.

# 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

Nie skompiluje się tak, jak napisano - myślę, że masz na myśli, że linia jest 4 spacje w lewo, wyrównane z komentarzem "print element.text". Co widziałeś, kiedy miałeś to niewyjaśnione, BTW? –

Odpowiedz

19

Przekonasz się, że istnieje wiele elementów w dokumencie XML, które nie zawierają danych znakowych (tzn. Tekstu). Jedną z miłych rzeczy o Pythonie jest to, że brak jest fałszywe w ramach warunkowego, sprzęgła, które wiedzą, w jaki sposób warunkowy oświadczenia zwarcie oznacza, że ​​nie jest to bardzo proste rozwiązanie problemu, należy zmienić linię:

if "%begdate%" in element.text: 

do:

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

gdy nie ma tekstu, a następnie element.text jest None, aka false, a wtedy nie będzie nawet dostać się do części warunkowej, która jest przyczyną błędu.

+3

+1: Jeszcze lepiej byłoby, gdyby element.text nie był Brak i "% begdate%" w element.text: '. – jathanism

+0

Hej dzięki wszystkim. To rozwiązało mój problem. Chciałbym zagłosować, ale najwyraźniej nie mam tu wystarczająco silnej reputacji. Doceniam szybkie odpowiedzi od wszystkich! – Mike

1

Podany błąd sugerowałby, że jeden z tagów, które iterujesz, nie zawiera tekstu.
myślę lepszy sposób to zrobić sprawdzenie byłoby wymienić, że jeśli sprawozdanie z jednego z następujących powodów:

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

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

pierwszym przykładzie sprawdza, czy równość, drugi wykorzystuje regular expression aby sprawdzić, czy zmienna zawiera swoje strunowy. Nie wiem, w jaki sposób wyrazy regularne obsługują przestrzeń wyszukiwania None ... która może zawieść.

Powiązane problemy