2011-06-29 17 views
18

私はPythonを使用してXMLファイルを編集しようとしています。タグのキーワードを見つけて置き換えたい過去には、同僚がテンプレートXMLファイルを設定し、これらのキーワードを置き換えるための「検索と置換」プログラムを使用しました。私はPythonを使用してこれらのキーワードを見つけて値で置き換えたいと考えています。私はElementtreeモジュールを自分自身で教えてきましたが、見つけて交換するのに問題があります。私は自分のXMLファイルの小さなビットを付けました。 %で囲まれた変数(%SITEDESCR%)が表示されます。これは、置き換えてから新しいファイルに保存する言葉です。どんな助けや提案も素晴らしいでしょう。Pythonを使用したXMLの値の検索と置換

おかげで、 マイク

<metadata> 
<idinfo> 
<citation> 
<citeinfo> 
<origin>My Company</origin> 
<pubdate>05/04/2009</pubdate> 
<title>POLYGONS</title> 
<geoform>vector digital data</geoform> 
<onlink>\\C$\ArcGISDevelopment\Geodatabase\PDA_STD_05_25_2009.gdb</onlink> 
</citeinfo> 
</citation> 
<descript> 
<abstract>This dataset represents the mapped polygons developed from the field data for the %SITEDESCR%.</abstract> 
<purpose>This dataset was created to accompany some stuff.</purpose> 
</descript> 
<timeperd> 
<timeinfo> 
<rngdates> 
<begdate>%begdate%</begdate> 
<begtime>unknown</begtime> 
<enddate>%enddate%</enddate> 
<endtime>unknown</endtime> 
</rngdates> 
</timeinfo> 
<current>ground condition</current> 
</timeperd> 
+6

まともなXMLパーサーを使って、XMLを解析し、ノードを見つけて、ファイルを書き戻してください...どこに問題がありますか? –

+1

+1からxmlパーサ。私はlxmlが好きです。 'easy_install lxml' – matchew

+0

[PythonのためのベストクロスプラットフォームXMLパーサー]の複製が可能です。(http://stackoverflow.com/questions/451057/best-cross-platform-xml-parsers-for-python) –

答えて

28

基礎:

from xml.etree import ElementTree as et 
tree = et.parse(datafile) 
tree.find('idinfo/timeperd/timeinfo/rngdates/begdate').text = '1/1/2011' 
tree.find('idinfo/timeperd/timeinfo/rngdates/enddate').text = '1/1/2011' 
tree.write(datafile) 

をタグ場合は、パスを短くすることができます名前はユニークです。この構文は、ツリーの任意の深度レベルにある最初のノードを検索します。

tree.find('.//begdate').text = '1/1/2011' 
tree.find('.//enddate').text = '1/1/2011' 

また、documentation、esp。ノードを見つけるためのXPathのサポート。

+0

ありがとう、Mark。これはまさに私が探していたものです。これは私のexsiting pythonプログラムで動作します。 – Mike

2

あなただけ%で囲まれたビットを交換したい場合は、これは本当にXMLの問題ではありません。あなたは簡単に正規表現でそれを行うことができます。

import re 
xmlstring = open('myxmldocument.xml', 'r').read() 
substitutions = {'SITEDESCR': 'myvalue', ...} 
pattern = re.compile(r'%([^%]+)%') 
xmlstring = re.sub(pattern, lambda m: substitutions[m.group(1)], xmlstring) 
+1

これをスタンドアロンスクリプトでテストしたところ、うまくいきました。私はこれを将来の参照のために私のPythonライブラリに追加します。応答していただきありがとうございます。 – Mike

0

ジュストは、行毎にファイルを読み込むと置き換えます

for line in open(template_file_name,'r'): 
    output_line = line 
    output_line = string.replace(output_line, placeholder, value) 
    print output_line 
+0

これも機能します!私はpostiveのフィードバックに感謝! – Mike

+0

これは壊れやすい可能性があります - XMLファイルは単なるテキストではありません。空白はXMLでは一般的に重要ではないので、入力ファイルを変更すると、コードで認識されないXMLと同じものが返される可能性があります。 –

+0

%something%プレースホルダに空白がない場合は、必要に応じて特に< and >のような特別なXML文字をエンコードするだけです。 –

関連する問題