我有可能用Xpath解决属性的兄弟问题吗?

时间:2013-09-11 08:50:03

标签: xml xpath

我有以下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建议非常感谢。

非常感谢你。亲切的问候,迈克尔

1 个答案:

答案 0 :(得分:0)

您可以使用XPath

*/@text | */@maxlength

结果列表将按照它们在XML中出现的顺序包含(textmaxlength)的属性值。

例如,使用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(上面发布)。