过去几天,我进行了广泛的搜索,但似乎找不到 我想要的东西。我使用Python 2.7.3和ElementTree编写了一个脚本,以 解析XML文件并编辑XML文件中深处的属性。该 脚本工作正常。上周晚些时候, 我与客户开会,他告诉我目标平台将是CentOS。我以为没问题。为了 在预期的平台上进行测试,我创建了一个CentOS VMWare客户端,令我 惊讶的是,我的脚本破了床,给了我错误消息“ SyntaxError:期望的路径分隔符([) ”)。在研究 此错误的性质的过程中消息,我了解到CentOS 6.4支持Python 2.6.6,其中包含ElementTree的较旧版本,该版本不 支持搜索属性[@attribute]语法。 该客户不会在平台上升级Python,也不会安装 其他库,因此lxml不是我的选择。我的问题是, 在没有ElementTree 支持[@attribute]功能的情况下,我是否仍可以某种方式访问埋入的属性并对其进行编辑?
这是我正在处理的那种XML的示例:
` <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <my-gui> <vehicles> <car vendor="Ford"/> </vehicles> <options> <line transmission='manual'/> </options> <title>Dealership</title> <choice id='manual' title="Dealership"> <pkg-deal id='manual' auth='manager'>.</pkg-deal> </choice> <choice id='manual' title='Dealership'/> <choice id='manual' DealerLocation='Dealer_Loc'/> <choices-outline color='color_choice'> <line choice='blue'/> </choices-outline> <choice id='cars' GroupID='convertables'> <pkg-deal id='model.Taurus' version="SEL" arguments='LeatherInterior' enabled='XMRadio'>Taurus</pkg-deal> <pkg-deal id='model.Mustang' version="GT" enabled='SIRIUSRadio'>Mustang</pkg-deal> <pkg-deal id='model.Focus' version="SE" enabled='XMRadio'>Focus</pkg-deal> <pkg-deal id='model.Fairlane'>Fairlane</pkg-deal> <pkg-deal id='model.Fusion' version="SE" arguments='ClothInerior'>Fusion</pkg-deal> <pkg-deal id='model.Fiesta' version="S Hatch" enabled="SIRIUSRadio">Fiesta</pkg-deal> </choice> </my-gui> `
Here’s a snippet of the successful Python 2.7.3 code that breaks under Python 2.6.6:
if self.root.iterfind('pkg-deal'): self.deal = self.root.find('.//pkg-deal[@id="model.fusion"]') self.arg = str(self.deal.get('arguments')) if self.arg.find('with Scotchguard=') > 0: QtGui.QMessageBox.information(self, 'DealerAssist', 'The selected car is already updated. Nothing to do.') self.leave() self.deal.set('arguments', self.arg + ' with Scotchguard') ... ...
有什么方法可以修改此“ if”语句块的第一行, 从而允许我编辑Fusion元素的“ arguments”属性?还是我 被降级为实现libxml2,这肯定会带来很大的痛苦?…
这可能会绕过这个问题,但是您可以尝试 从Python 2.7复制并粘贴ElementTree的版本,对其进行重命名以避免 与标准库冲突,然后导入和使用它。
但是,由于ElementTree并不是要用作独立文件,因此 您需要浏览C:\Python27\Lib\xml并复制整个 etree文件夹,并通过import etree.ElementTree 在脚本内执行操作来导入ElementTree 。
为避免意外地从 Python 2.6导入或使用ElementTree版本,您可能应该重命名etree文件夹,其内容, 删除.pyc文件并修复文件内部的导入以引用 Python 2.7版本。