我有以下xml文件(摘录):
<duty_room_txt_Alarm text="Alarm" />
<duty_room_txt_Alarm default="Alarm" />
<duty_room_txt_Alarm maxlength="16" />
<duty_room_txt_Permanent_Failure text="Test" />
<duty_room_txt_Permanent_Failure default="Test" />
<duty_room_txt_Permanent_Failure maxlength="32" />
<duty_room_txt_Temporary_Failure text="Return" />
<duty_room_txt_Temporary_Failure default="Return" />
<duty_room_txt_Temporary_Failure maxlength="32" />
...
我需要提取所有属性text
进行翻译,同时牢记maxlength
属性。
有没有办法为每个maxlength
属性添加text
属性?该列表有数千行,分别处理每个元素太麻烦了。
Anny建议非常感谢。
非常感谢你。亲切的问候,迈克尔
答案 0 :(得分:0)
您可以使用XPath
*/@text | */@maxlength
结果列表将按照它们在XML中出现的顺序包含(text
和maxlength
)的属性值。
例如,使用Python:
import lxml.etree as ET
content = '''\
<root>
<duty_room_txt_Alarm text="Alarm" />
<duty_room_txt_Alarm default="Alarm" />
<duty_room_txt_Alarm maxlength="16" />
<duty_room_txt_Permanent_Failure text="Test" />
<duty_room_txt_Permanent_Failure default="Test" />
<duty_room_txt_Permanent_Failure maxlength="32" />
<duty_room_txt_Temporary_Failure text="Return" />
<duty_room_txt_Temporary_Failure default="Return" />
<duty_room_txt_Temporary_Failure maxlength="32" />
</root>'''
root = ET.fromstring(content)
print(root.xpath('*/@text | */@maxlength'))
打印
['Alarm', '16', 'Test', '32', 'Return', '32']
对于您使用的软件,XML格式可能存在问题。解决方法可能是重写XML看起来更像这样:
<root>
<duty_room_txt_Alarm text="Alarm" default="Alarm" maxlength="16"/>
<duty_room_txt_Permanent_Failure text="Test" default="Test" maxlength="32"/>
<duty_room_txt_Temporary_Failure text="Return" default="Return" maxlength="32"/>
</root>
在Python中可以这样做:
<强> prog.py:强>
import lxml.etree as ET
import itertools as IT
content = '''\
<root>
<duty_room_txt_Alarm text="Alarm" />
<duty_room_txt_Alarm default="Alarm" />
<duty_room_txt_Alarm maxlength="16" />
<duty_room_txt_Permanent_Failure text="Test" />
<duty_room_txt_Permanent_Failure default="Test" />
<duty_room_txt_Permanent_Failure maxlength="32" />
<duty_room_txt_Temporary_Failure text="Return" />
<duty_room_txt_Temporary_Failure default="Return" />
<duty_room_txt_Temporary_Failure maxlength="32" />
</root>'''
root = ET.fromstring(content)
for key, group in IT.groupby(root, lambda elt: elt.tag):
first = next(group)
parent = first.getparent()
for elt in group:
first.attrib.update(elt.attrib)
parent.remove(elt)
print(ET.tostring(root))
运行python prog.py
会打印重新构造的XML(上面发布)。