ElementTree SyntaxError:预期路径分隔符([)

时间:2013-04-01 23:36:21

标签: python libxml2 elementtree

过去几天我进行了广泛的搜索,似乎无法找到我正在寻找的东西。我使用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>

`

以下是Python 2.6.6中成功的Python 2.7.3代码的片段:

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,这有望成为一个真正的痛苦?...

感谢。

2 个答案:

答案 0 :(得分:0)

这可能是一个侧面的问题,但您可以尝试从Python 2.7复制并粘贴ElementTree的版本,重命名它以避免与标准库冲突,并导入和使用它。

但是,由于ElementTree不打算用作独立文件,您需要做的是导航到C:\Python27\Lib\xml并复制整个etree文件夹并通过执行{{1}导入ElementTree在你的脚本里面。

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

答案 1 :(得分:0)

另一个用户here.

解决了同样的问题

此用户在Python 2.6中手动过滤了该属性。我在这里发布了他们的代码示例,即使该示例专门针对提问者的代码:

def final_xml(self,username):
    users = self.root.findall("user")
    for user in users:
        if user.attrib.get('username') == 'user1':
            break
    else:
        raise ValueError('No such user')

    # `user` is now set to the correct element
    self.root.remove(user)
    print user
    tree = ET.ElementTree(self.root)
    tree.write("msl.xml")