You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中使用继承的xml:lang属性?

利用xml:lang继承特性统计多语言元素

一、使用lxml实现(推荐,支持XPath)

lxml完全支持XPath表达式,可以直接用ancestor-or-self::*[@xml:lang][1]/@xml:lang来获取元素继承的xml:lang值。这个表达式会从当前元素开始,向上查找第一个带有xml:lang属性的元素(包括自身),返回其属性值。

修改后的代码如下:

import lxml.etree as ET

data = '''
<project>
<doc xml:lang="la">
  <title>Lorem <important>ipsum</important></title>
  dolor <important>sit</important> amet.
</doc>
<doc xml:lang="sv">
  <title xml:lang="la">Consectetur <important>adipiscing</important> elit</title>
  Viterligit warj allom them som <important>thetta breff</important> see.
</doc>
</project>'''

root = ET.fromstring(data)

importants = {'la': [], 'sv': []}
for important in root.iter('important'):
    # 通过XPath获取继承的xml:lang值
    lang = important.xpath('ancestor-or-self::*[@xml:lang][1]/@xml:lang')[0]
    importants[lang].append(important.text)
print(importants)
# 输出: {'la': ['ipsum', 'sit', 'adipiscing'], 'sv': ['thetta breff']}

二、使用标准库ElementTree实现

标准库的ElementTree对XPath的支持有限(不支持ancestor-or-self这类轴),需要手动遍历元素的祖先链来查找xml:lang属性:

import xml.etree.ElementTree as ET

data = '''
<project>
<doc xml:lang="la">
  <title>Lorem <important>ipsum</important></title>
  dolor <important>sit</important> amet.
</doc>
<doc xml:lang="sv">
  <title xml:lang="la">Consectetur <important>adipiscing</important> elit</title>
  Viterligit warj allom them som <important>thetta breff</important> see.
</doc>
</project>'''

root = ET.fromstring(data)

def get_inherited_lang(element):
    # XML命名空间下的lang属性键
    lang_attr = '{http://www.w3.org/XML/1998/namespace}lang'
    # 先检查自身是否有该属性
    if lang_attr in element.attrib:
        return element.attrib[lang_attr]
    # 向上遍历祖先元素
    parent = element.getparent()
    while parent is not None:
        if lang_attr in parent.attrib:
            return parent.attrib[lang_attr]
        parent = parent.getparent()
    # 无匹配时返回None(可根据需求调整默认值)
    return None

importants = {'la': [], 'sv': []}
for important in root.iter('important'):
    lang = get_inherited_lang(important)
    if lang in importants:
        importants[lang].append(important.text)
print(importants)
# 输出: {'la': ['ipsum', 'sit', 'adipiscing'], 'sv': ['thetta breff']}

内容的提问来源于stack exchange,提问作者Jere Kupari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 05:37:30