如何在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
相关产品推荐
相关产品推荐

