为什么cElementTree iterparse返回无元素?

时间:2015-03-08 15:35:00

标签: python xml elementtree

我正在尝试使用cElementTree.iterparse解析xml文件。 但是,我无法理解发生了什么,因为iterparse返回空元素。 我有一个xml文件具有以下近似布局:

<DOCS>
  <ID id="1">
    <HEAD>title1</HEAD>
    <DATE>21.01.2010</DATE>
    <TEXT>
      <P>some text</P>
      <P>some text</P>
      <P>some text</P>
    </TEXT>
  </ID>

  <ID id="2">
    <HEAD>title2</HEAD>
    <DATE>21.01.2010</DATE>
    <TEXT>
      some text
    </TEXT>
  </ID>
</DATA>

我正在尝试从TEXT代码中提取文字,或者遍历TEXT代码子代(P代码),并从中提取文字。

这是我的代码:

import xml.etree.cElementTree as cet

docs = {}
id = ''
for event, elem in cet.iterparse(xml_data, events=('end',)):
    if elem.tag == 'ID':
        id = elem.attrib['id']
    if elem.tag == 'TEXT':
        if list(elem):
            docs[id] = ''.join([p.text for p in elem])
        else:
            docs[id] = elem.text
#print(docs)
return docs

当我执行我的代码时,我得到:

    docs[id] = ''.join([p.text for p in elem])
TypeError: sequence item 14: expected str instance, NoneType found

这意味着列表理解p中的[p.text for p in elem]之一是None。好的,我使用print语句知道哪个是以前的p文本,看看xml文件标签是否有问题。好吧,实际上没有任何文本的p元素应该拥有它,因为它在xml文件中有一个文本正文。有人可以解释发生了什么吗?

1 个答案:

答案 0 :(得分:0)

忘记if event == 'end':检查的愚蠢错误。

所以,发生的事情是只有当event == 'end'我们有一个完全填充的elem对象时。

相关问题