使用elementtree解析XML文件:' NoneType'对象没有属性' text'

时间:2017-05-10 11:31:13

标签: python-2.7 elementtree

我尝试使用Python 2.7中的ElementTree解析XML文件中的信息。

XML文件具有以下结构:

 <EXPERIMENT_PACKAGE_SET>
    <EXPERIMENT_PACKAGE>
        <SAMPLE>
            <IDENTIFIERS>
                <PRIMARY_ID>ERS1486582</PRIMARY_ID>
                <EXTERNAL_ID>SAMEA36350668</EXTERNAL_ID>
            </IDENTIFIERS>
            <SAMPLE_ATTRIBUTES>
                <SAMPLE_ATTRIBUTE>
                    <TAG>collection date</TAG>
                    <VALUE>2011</VALUE>
                </SAMPLE_ATTRIBUTE>
                <SAMPLE_ATTRIBUTE>
                    <TAG>geographic location</TAG>
                    <VALUE>USA</VALUE>
                </SAMPLE_ATTRIBUTE>
                ...
            </SAMPLE_ATTRIBUTES>
        </SAMPLE>
    ...
    </EXPERIMENT_PACKAGE>
</EXPERIMENT_PACKAGE_SET>

它包含许多&#34; Sample&#34;我想循环的模块,从&#34;标识符&#34;解析一些信息。模块,然后在他们的&#34;样本属性列表中再次循环&#34;将它们存储在一个文件中,包括每个文件的标记和标记。和&#34;价值&#34;。这些数据不是标准化的(即属性标签不总是匹配)所以我想为每个样本输出所有这些数据。我编写了这段代码,它与其他具有相同结构的XML文件一起使用:

# import the XML file
e = xml.etree.ElementTree.parse('file.xml').getroot()
# create output file
file = open('output.txt','w')
# loop over all "Sample" modules
for i in range(0,len(e.findall('EXPERIMENT_PACKAGE/SAMPLE'))):
    node = e.findall('EXPERIMENT_PACKAGE/SAMPLE')[i]
    accession = node.find('IDENTIFIERS/PRIMARY_ID').text
    sample = node.find('IDENTIFIERS/EXTERNAL_ID').text                
    # loop over the list of attributes and print 'accession', 'sample', and for each attribute, 'tag' and 'value'   
    for attribute in node.findall('SAMPLE_ATTRIBUTES/SAMPLE_ATTRIBUTE'):
           file.write(accession + '\t' + sample + '\t' + str(attribute.find('TAG').text) + '\t' + 
           str(attribute.find('VALUE').text) + '\n')
file.close()

此代码过去有效,它应该输出如下:

> ERS1486582    SAMEA36350668   collection date 2011
> ERS1486582    SAMEA36350668   geographic location USA 
> ...

但是这个特殊的XML文件给了我一个错误:

  

AttributeError:&#39; NoneType&#39;对象没有属性&#39; text&#39;

我猜有些元素没有值?在写出值之前,我怎么能尝试检查元素是否不是NoneType?我试过添加“如果&#39;条件如:

if attribute.find('VALUE').text is not None:

在第二个&#39;中&#39;循环(在输出文件中写入之前),但它也没有工作。非常感谢你的帮助,如果我没有清楚地表达自己,那就很抱歉。

0 个答案:

没有答案