过去几天我进行了广泛的搜索,似乎无法找到我正在寻找的东西。我使用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,这有望成为一个真正的痛苦?...
感谢。
答案 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")