ElementTree的语法错误:预期路径分离器([)(ElementTree SyntaxErro

2019-08-18 20:07发布

我广泛关注过去几天,似乎无法找到我要找的。 我已经写了使用Python 2.7.3和ElementTree的解析XML文件并编辑XML文件中深埋属性的脚本。 该脚本工作正常。 我上周晚些时候开了一个会与谁告诉我的目标平台将是CentOS的客户。 我想,没问题。 为了测试我创建了一个CentOS的VMware客户端和出乎我的意料我的脚本crapped床上预期的平台上,给我的错误消息“ 语法错误:预期路径分隔符([])”在我研究这个错误的性质的过程消息我才知道的CentOS 6.4支持Python 2.6.6,其中包含ElementTree中的旧版本不具备用于搜索属性[@attribute]语法的支持。
这个客户不会在平台上升级的Python,也不会安装额外的库,所以LXML不是我的选择。 我的问题是,我可以以某种方式仍然可以访问埋属性和编辑它没有为[@attribute]设施ElementTree的支持?

这里是一种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') 
          ...
      ...

有没有一种方法,我可以修改这个“如果”语句块,让我编辑的融合元素的“参数”属性的第一线? 还是我退居实施libxml2的,这将是一个真正的痛苦?...

谢谢。

Answer 1:

这可能是侧步的问题,但你可以只是尝试复制和粘贴的ElementTree的版本从Python 2.7版,将其改名为避免与标准库相冲突,并导入和使用。

然而,由于ElementTree的是不是意味着要作为一个独立的文件,你需要做的是定位到C:\Python27\Lib\xml和复制整个etree做文件夹和进口ElementTree的import etree.ElementTree你的脚本中。

为了避免意外导入或使用ElementTree的版本从Python 2.6中,你或许应该重新命名etree文件夹,它的内容,删除.pyc的文件,并修复里面的文件进口引用了Python 2.7版本。



Answer 2:

同样的问题是由其他用户解决在这里。

此用户在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") 


文章来源: ElementTree SyntaxError: expected path separator ([)