使用 ElementTree 从混合元素 xml 标签中获取文本

Get text from mixed element xml tags with ElementTree

我正在使用 ElementTree 来解析我拥有的 XML 文档。我从 u 标签中获取文本。其中一些包含混合内容,我需要将其过滤掉或保留为文本。我有两个例子:

<u>
   <vocal type="filler">
     <desc>eh</desc>
   </vocal>¿Sí? 
</u>

<u>Pues... 
   <vocal type="non-ling">
     <desc>laugh</desc>
   </vocal>A mí no me suena. 
</u>

如果类型是 filler,我想获取 vocal 标签中的文本,但如果它的类型是 non-ling,我就不想获取它。

如果我遍历 u 的子项,最后的文本位总是丢失。我可以达到它的唯一方法是使用 itertext()。但是这样就失去了检查声乐标签类型的机会。

我如何解析它才能得到这样的结果:

eh ¿Sí? 
Pues... A mí no me suena. 

丢失的文本位,“¿Sí?”和 "A mí no me suena.",可用作每个 <vocal> 元素(元素结束标记后的文本)的 tail 属性。

这是获得所需输出的方法(使用 Python 2.7 测试)。

假设 vocal.xml 看起来像这样:

<root>
  <u>
    <vocal type="filler">
      <desc>eh</desc>
    </vocal>¿Sí? 
  </u>

  <u>Pues... 
     <vocal type="non-ling">
       <desc>laugh</desc>
     </vocal>A mí no me suena. 
  </u>
</root>

代码:

from xml.etree import ElementTree as ET

root = ET.parse("vocal.xml") 

for u in root.findall(".//u"):
    v = u.find("vocal")

    if v.get("type") == "filler":
        frags = [u.text, v.findtext("desc"), v.tail]
    else:
        frags = [u.text, v.tail]

    print " ".join(t.encode("utf-8").strip() for t in frags).strip()

输出:

eh ¿Sí?
Pues... A mí no me suena.