为什么 cElementTree iterparse return None 元素?

Why does cElementTree iterparse return None elements?

我正在尝试用 cElementTree.iterparse 解析 xml 文件。 但是,我不明白发生了什么,因为 iterparse returns 空元素。 我有一个 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.text for p in elem]中的p之一是None。好吧,我用print语句知道哪个是前面的p文本,看看是不是xml文件标签有问题。好吧,实际上没有任何文本的 p 元素应该有它,因为它在 xml 文件中有一个文本主体。有人能解释一下这是怎么回事吗?

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

所以,只有当 event == 'end' 我们有一个完全填充的 elem 对象时,才会发生这种情况。