我尝试使用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;循环(在输出文件中写入之前),但它也没有工作。非常感谢你的帮助,如果我没有清楚地表达自己,那就很抱歉。