web-dev-qa-db-ja.com

Pythonを使用してXMLの値を検索および置換

Pythonを使用してXMLファイルを編集しようとしています。タグ内のキーワードを見つけて置き換えたいです。過去に、同僚がテンプレートXMLファイルをセットアップし、「検索と置換」プログラムを使用してこれらのキーワードを置換していました。 pythonを使用して、これらのキーワードを見つけて値に置き換えます。Elementtreeモジュールを教えてきましたが、検索と置き換えを試みるのに問題があります。 XMLファイルのsnid-bit。%で囲まれた変数がいくつかあります(つまり、%SITEDESCR%)これらは、置換してから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>
28
Mike

基礎:

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 、特にを読んでください。 XPath ノード検索のサポート。

50
Mark Tolonen

%で囲まれたビットを単に置き換えたい場合、これは実際には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)
5
Ismail Badawi

Justeはファイルを1行ずつ読み取り、置き換えます。

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