2011-07-20 34 views
5

Tôi đang cố mở thư mục chứa một chuỗi XML trong một thư mục cụ thể.
Trong đoạn mã sau, tôi đang lặp qua từng tài liệu XML, và tôi đang thiết lập một số câu lệnh if để đọc văn bản trong XML, tìm từ khóa và thay thế chúng rồi viết một tệp mới vào một vị trí mới.
Tôi nhận được lỗi sau khi tôi chạy kịch bản:đối số của loại 'NoneType' không thể lặp lại

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

Lỗi Thông tin:

argument of type 'NoneType' is not iterable 

tôi đã cứng mã hóa thư mục với một XML cụ thể và khi tôi chạy qua nếu phát biểu, họ làm việc tốt.
Đó là khi tôi cố gắng thiết lập để lặp qua một chuỗi XML mà tôi gặp phải lỗi.
Tôi đã tìm kiếm thông qua trang web này để xem liệu tôi có thể là giải pháp cuối cùng hay không, nhưng tất cả các vấn đề khác với vấn đề của tôi hoặc tôi không hoàn toàn hiểu được công việc xung quanh.

Tôi đã sử dụng một số dòng in để kiểm tra đầu ra.
Mọi thứ hoạt động tốt cho đến khi tôi nhận được câu lệnh if và sau đó phát sinh lỗi.

# 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

Điều đó sẽ không biên dịch thành văn bản - tôi nghĩ bạn có ý nghĩa đối với dòng được đề cập là 4 dấu cách ở bên trái, được căn chỉnh với phần tử in 'đã nhận xét.text' đã nhận xét. Bạn đã thấy gì khi bạn có BTW chưa được chú ý này? –

Trả lời

19

Bạn sẽ thấy rằng có nhiều phần tử trong tài liệu xml không chứa dữ liệu ký tự (ví dụ: văn bản). Một trong những điều tốt đẹp về python là Không là sai trong một điều kiện, khớp nối rằng với kiến ​​thức về cách phát biểu có điều kiện ngắn mạch có nghĩa là có một giải pháp thực sự đơn giản cho vấn đề của bạn, thay đổi dòng:

if "%begdate%" in element.text: 

để:

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

khi không có văn bản, sau đó element.text là None, aka False, và sau đó bạn thậm chí sẽ không nhận được một phần của điều kiện gây ra lỗi.

+3

+1: Thậm chí tốt hơn sẽ là 'nếu element.text không phải là None và"% begdate% "trong phần tử.text:'. – jathanism

+0

Xin cảm ơn tất cả mọi người. Điều này giải quyết được vấn đề của tôi. Tôi sẽ bỏ phiếu, nhưng dường như tôi không có danh tiếng đủ mạnh ở đây. Tôi đánh giá cao câu trả lời nhanh từ mọi người! – Mike

1

Lỗi bạn đưa ra sẽ gợi ý rằng một trong các thẻ bạn đang lặp lại không chứa văn bản.
Tôi nghĩ rằng một cách tốt hơn để thực hiện kiểm tra điều đó sẽ thay thế rằng nếu tuyên bố với một trong các cách sau:

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

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

Ví dụ kiểm tra đầu tiên cho sự bình đẳng, thứ hai sử dụng một regular expression để xem nếu thẻ chứa của bạn chuỗi. Tôi không chắc chắn các biểu thức thông thường xử lý một không gian tìm kiếm None ... có thể thất bại như thế nào không.

Các vấn đề liên quan