3

在过去的几天里,我进行了广泛的搜索,似乎找不到我想要的东西。我使用 Python 2.7.3 和 ElementTree 编写了一个脚本来解析 XML 文件并编辑隐藏在 XML 文件中的属性。该脚本工作正常。上周晚些时候,我与一位客户开会,他告诉我目标平台将是 CentOS。我想,没问题。为了在预期的平台上进行测试,我创建了一个 CentOS VMWare 客户端,令我惊讶的是,我的脚本搞砸了,给了我错误消息“ SyntaxError: expected path separator ([) ” 在我研究这个错误的性质的过程中message 我了解到 CentOS 6.4 支持 Python 2.6.6,
这个客户不会在平台上升级 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,这有望成为一个真正的痛苦?...

谢谢。

4

2 回答 2

0

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

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

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

于 2013-04-02T20:25:49.247 回答
0

另一个用户在这里解决了同样的问题

该用户在 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") 
于 2015-02-24T16:03:02.077 回答