3

過去数日間、広範囲に検索しましたが、探しているものが見つからないようです。Python 2.7.3 と ElementTree を使用して XML ファイルを解析し、XML ファイルの奥深くに埋め込まれた属性を編集するスクリプトを作成しました。スクリプトは正常に動作します。先週遅くに顧客とミーティングを行ったところ、ターゲット プラットフォームは CentOS になるとのことでした。問題ないと思いました。予想されるプラットフォームでテストするために、CentOS VMWare クライアントを作成しましたが、驚いたことに、スクリプトがベッドを台無しにし、「SyntaxError: expected path separator ([)」というエラー メッセージが表示されました。このエラーの性質を調査する過程でメッセージ CentOS 6.4 が Python 2.6.6 をサポートしていることを知りました。
この顧客は、プラットフォーム上の 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') 
          ...
      ...

この 'if' ステートメント ブロックの最初の行を変更して、Fusion 要素の 'arguments' 属性を編集できるようにする方法はありますか? それとも、本当に面倒なことが約束されている libxml2 の実装に追いやられているのでしょうか?...

ありがとう。

4

2 に答える 2

0

これは質問を回避している可能性がありますが、Python 2.7 から ElementTree のバージョンをコピーして貼り付け、標準ライブラリとの競合を避けるために名前を変更し、それをインポートして使用することができます。

ただし、ElementTree はスタンドアロン ファイルとして使用することを意図していないため、フォルダーC:\Python27\Lib\xml全体に移動してコピーし、スクリプト内etreeで実行して ElementTree をインポートする必要がありimport etree.ElementTreeます。

Python 2.6 から ElementTree のバージョンを誤ってインポートしたり使用したりしないようにするには、おそらくetreeフォルダーとその内容の名前を変更し、ファイルを削除し、.pycファイル内のインポートを修正して Python 2.7 バージョンを参照する必要があります。

于 2013-04-02T20:25:49.247 に答える