您可以使用 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 中可以这样做:
程序.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(在上面发布)。