Python XML AttributeError:' NoneType'对象没有属性' text'

时间:2016-10-31 19:10:34

标签: python xml

我在弄清楚为什么会收到以下错误

时遇到问题
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文件中,有一个&#34;黄色&#34; element有三个子元素,包括&#34; car&#34;,&#34; cat&#34;和&#34; cap&#34;但不是每个&#34;黄色&#34; element有三个子元素。在第一个&#34;黄色&#34;下面的XML中元素有&#34; cat&#34;子节点和第二个&#34;黄色&#34;元素没有&#34; cat&#34;子元素,但在完整的XML文件中,&#34;黄色&#34;元素可以包含任何一个,两个或三个&#34; cat&#34;,&#34; cap&#34;和&#34;汽车&#34;儿童元素。我知道这是导致错误但我不知道如何解决它。有没有人有任何关于如何解决此错误的想法或提示?谢谢。

1 个答案:

答案 0 :(得分: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级树递归是必要的。