0

我有以下 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属性?该列表有数千行,单独处理每个元素太麻烦了。

非常感谢任何建议。

太感谢了。亲切的问候,迈克尔

4

1 回答 1

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 中可以这样做:

程序.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(在上面发布)。

于 2013-09-11T08:56:43.723 回答