ElementTree SyntaxError: oczekiwany separator ścieżki ([)
Szukałem obszernie przez ostatnie kilka dni i nie mogę znaleźć tego, czego szukam. Napisałem skrypt używający Pythona 2.7.3 i ElementTree do analizowania pliku XML i edytowania atrybutu zakopanego głęboko w pliku XML. Skrypt działa dobrze. W zeszłym tygodniu miałem spotkanie z klientem, który poinformował mnie, że docelową platformą będzie CentOS. Nie ma problemu. Aby przetestować na przewidywanej platformie, stworzyłem klienta CentOS VMWare i ku mojemu zdziwieniu mój skrypt zgniótł łóżko, dając mi komunikat o błędzie „SyntaxError: oczekiwany separator ścieżki ([)„W trakcie badania natury tego komunikatu o błędzie dowiedziałem się, że CentOS 6.4 obsługuje Python 2.6.6, który zawiera starszą wersję ElementTree, która nie obsługuje wyszukiwania składni atrybutów [@attribute].
Ten klient nie zaktualizuje Pythona na platformie ani nie zainstaluje dodatkowych bibliotek, więc lxml nie jest dla mnie opcją. Moje pytanie brzmi, czy nadal mogę uzyskać dostęp do zakopanego atrybutu i edytować go bez obsługi ElementTree dla obiektów [@atrybut]?
Oto przykład rodzaju XML, z którym mam do czynienia:
`
<?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>
`
Oto fragment udanego kodu Pythona 2.7.3, który łamie się pod Pythonem 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')
...
...
Czy jest sposób, w jaki mogę zmodyfikować pierwszą linię tego bloku instrukcji „if”, która pozwoli mi edytować atrybut „argumenty” elementu Fusion? A może jestem przeniesiony do implementacji libxml2, co zapowiada się na prawdziwy ból? ...
Dzięki.