xml - 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")
解决方案
我通过用常规属性替换命名空间属性解决了这个问题。之后,基本代码让我可以分别找到英文和法文术语。见下文:
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)
推荐阅读
- android - Android 横向活动首先以纵向打开,然后切换到横向
- jenkins - 用于针对构建进行编码标准验证的最佳 Jenkins 插件(对于 .NET)
- ruby-on-rails - IntegrationTest 从配置中引发错误?
- angular - Karma 的角度测试错误
- google-apps-script - 以域管理员身份从 Google 课堂检索课程作业资源时出现权限错误
- javascript - KnockoutJS - 将 observableArray 与另一个 observableArray 进行比较
- biztalk - BizTalk 批处理配置筛选器未保存
- spring - 基本 Spring JDBC 应用程序,未找到 JdbcTemplate bean
- python - TypeError: __init__() 接受 4 个位置参数,但给出了 7 个
- javascript - 在 JavaScript 中创建多个按钮