首页 > 解决方案 > Python分别提取xml文件中的英文术语和法文术语(IATE数据库导出)

问题描述

我有一个 tbx 文件,它是 xml 格式的术语数据库提取。这是一个例子:

 <termEntry id="IATE-47204">
    <descripGrp>
      <descrip type="subjectField">2431, 52</descrip>
    </descripGrp>
    <langSet xml:lang="en">
      <tig>
        <term>insurance company</term>
        <termNote type="termType">fullForm</termNote>
        <descrip type="reliabilityCode">3</descrip>
      </tig>
    </langSet>
    <langSet xml:lang="fr">
      <tig>
        <term>compagnie d'assurance</term>
        <termNote type="termType">fullForm</termNote>
        <descrip type="reliabilityCode">3</descrip>
      </tig>
    </langSet>
  </termEntry>

我尝试了许多代码但没有成功,因为我无法弄清楚如何在具有语言属性的祖父节点下选择特定术语。在我的所有代码中,该命令选择了所有术语节点(英语和法语)。例如,我想提取术语保险公司,将其复制到一个文本文件中,然后提取 compagnie d'assurance 并将其复制到另一个文本文件中。

此代码不起作用:

from xml.etree.ElementTree import ElementTree
tree = ElementTree()
root = tree.parse("export_EN_FR_essai IATE - Copie.xml")
for node in root.findall(".//langSet[@lang='en']/tig"):
    for type in node.getchildren():
        print(type.text)

这段代码几乎可以工作(如果 a == 'en' 只打印或复制英文术语,我找不到正确的命令行):

from xml.dom import minidom

xmldoc = minidom.parse('export_EN_FR_essai IATE - Copie.xml')
itemlist = xmldoc.getElementsByTagName('langSet')
print(len(itemlist))
for s in itemlist:
    a = (s.attributes['xml:lang'].value)
    if a == 'en':
        print ("anglais")
        print (s)
        for terme in root.xpath('//langSet[@xml:lang = "en"]/tig/term/'):
            print (terme.text)
    if a == 'fr':
        print ("français") 

标签: xmlpython-3.x

解决方案


我通过用常规属性替换命名空间属性解决了这个问题。之后,基本代码让我可以分别找到英文和法文术语。见下文:

print ("Les termes anglais :")
    for terme in tree.xpath('/termEntry/langSet[@lang="en"]/tig/term'):
    print (terme.text)

print ("Les termes français :")
     for terme in tree.xpath('/termEntry/langSet[@lang="fr"]/tig/term'):
     print (terme.text)

推荐阅读