2016-10-31 60 views
3

我有一個問題搞清楚,爲什麼我收到以下Python的XML AttributeError的:「NoneType」對象有沒有屬性「文本」

AttributeError: 'NoneType' object has no attribute 'text' 

我試圖導入使用Python 2.7的XML文件中的錯誤。以下是我的XML文件的樣子。

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!DOCTYPE dblp SYSTEM "file.dtd"> 

<top> 
    <blue key="2343998978"> 
     <animal>lion</animal> 
     <animal>seal</animal> 
     <state>california</state> 
     <zoo>san diego</zoo> 
     <year>2015</year> 
    </blue> 

    <red key="9383893838739"> 
     <elem_a>jennifer</elem_a> 
     <elem_a>paul</elem_a> 
     <elem_a>carl</elem_a> 
     <elem_b>kansas</elem_b> 
     <elem_d>australia</elem_d> 
    </red> 

    <yellow key="83963277272"> 
     <car>chevy</car> 
     <car>dodge</car> 
     <cap>baseball</cap> 
     <cat>tabby</cat> 
    </yellow> 

    <red key="9383893838739"> 
     <elem_a>greg</elem_a> 
     <elem_a>chris</elem_a> 
     <elem_a>john</elem_a> 
     <elem_b>arkansas</elem_b> 
     <elem_c>ice cream</elem_c> 
    </red> 

    <yellow key="84748346734"> 
     <car>toyota</car> 
     <car>honda</car> 
     <cap>football</cap> 
    </yellow> 
</top> 

我是新來的Python,但創建了下面的腳本來導入上面的XML文件,那就是當我收到上述錯誤。以下是我的代碼。

import xml.etree.ElementTree as ET 

myfile = 'C:/Users/user1/Desktop/file.xml' 

tree = ET.parse(myfile) 
root = tree.getroot() 

for x in root.findall('blue'): 
    animal = x.find('animal').text 
    key1 = x.attrib['key'] 
    state = x.find('state').text 
    zoo = x.find('zoo').text 
    year = x.find('year').text 
    print animal, key1, state, zoo, year 

for y in root.findall('red'): 
    elem_a = y.find('elem_a').text 
    key2 = y.attrib['key'] 
    elem_b = y.find('elem_b').text 
    elem_c = y.find('elem_c').text 
    elem_d = y.find('elem_d').text 
    print elem_a, key2, elem_b, elem_c, elem_d 

for z in root.findall('yellow'): 
    car = z.find('car').text 
    key3 = z.attrib['key'] 
    cap = z.find('cap').text 
    cat = z.find('cat').text 
    print car, key3, cap, cat 

在XML文件中有三種主要元素類型:藍色,紅色和黃色。對於某些父元素存在特定子元素的問題之一不適用於其他元素。例如,在上面的示例XML文件中,一個「黃色」元素具有三個子元素,包括「car」,「cat」和「cap」,但不是每個「yellow」元素都具有全部三個子元素。在下面的XML中,第一個「yellow」元素具有「cat」子節點,第二個「yellow」元素沒有「cat」子元素,但在完整的XML文件中,「yellow」元素可以具有任何一個,兩個或三個「貓」,「帽子」和「汽車」子元素。我知道這是導致錯誤,但我不知道如何解決它。有沒有人有任何想法或提示如何解決這個錯誤?謝謝。

+0

在您嘗試訪問找到的元素的文本,這些線中的一條,沒有元素被發現在所有。你可以在錯誤的回溯中看到錯誤的確切路線。您在該行中搜索的元素不存在。 – lucasnadalutti

+1

這行可能會導致錯誤:'elem_c = y.find('elem_c').text' - 'red'標籤中沒有'elem_c'。 – Jan

+0

此外,線'elem_d = y.find('elem_d').text'和'cat = z.find('cat').text'會給你同樣的錯誤。 – Marcs

回答

3

你可以通過樹,for x in root:經過根標籤藍色,紅色和黃色,然後對每個顏色標記可以爲子樹再次循環。

  • x.tag元素的標籤名稱。
  • x.attrib一個包含元素屬性的地圖。
  • x.getchildren()是一個元素的所有子元素的列表。
  • x.text是元素的文本內容。

一個例子:

import xml.etree.ElementTree as ET 

my_file = 'C:/Users/user1/Desktop/file.xml' 

tree = ET.parse(my_file) 
root = tree.getroot() 

def print_subtree(subtree): 
    for y in subtree: 
     print "\t", y.tag, ":", y.text 

for x in root: 
    print x.tag, x.attrib 
    print_subtree(x.getchildren()) 

這正常工作與兩個級別的樹,對於n級樹遞歸是必要的。

+0

嗨Marcs,這幫了很大忙。非常感謝你!!!完美的作品! – wsupport

+0

你應該用調試器檢查程序的流程並檢查各種元素,這對學習很有幫助,[PyCharm](https://www.jetbrains.com/pycharm/)有一個好的調試器,並且有一個免費的它的社區版本。 – Marcs

+0

如果您對答案滿意,可以通過提取我的答案來結束您的問題。 – Marcs

相關問題