一尘不染

ElementTree语法错误:预期的路径分隔符([)

python

过去几天,我进行了广泛的搜索,但似乎找不到
我想要的东西。我使用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元素的“ a​​rguments”属性?还是我
被降级为实现libxml2,这肯定会带来很大的痛苦?…


阅读 172

收藏
2021-01-20

共1个答案

一尘不染

这可能会绕过这个问题,但是您可以尝试
从Python 2.7复制并粘贴ElementTree的版本,对其进行重命名以避免
与标准库冲突,然后导入和使用它。

但是,由于ElementTree并不是要用作独立文件,因此
您需要浏览C:\Python27\Lib\xml并复制整个
etree文件夹,并通过import etree.ElementTree
在脚本内执行操作来导入ElementTree 。

为避免意外地从
Python 2.6导入或使用ElementTree版本,您可能应该重命名etree文件夹,其内容,
删除.pyc文件并修复文件内部的导入以引用
Python 2.7版本。

2021-01-20