2011-06-29 54 views
18

Estoy buscando editar archivos XML usando Python. Quiero encontrar y reemplazar palabras clave en las etiquetas. En el pasado, un compañero de trabajo había configurado archivos XML de plantilla y utilizaba un programa "buscar y reemplazar" para reemplazar estas palabras clave. Quiero usar Python para encontrar y reemplazar estas palabras clave con valores. Me he enseñado a mí mismo el módulo Elementtree, pero estoy teniendo problemas para intentar buscar y reemplazar. He adjuntado un poco de mi archivo XML. Verá algunas variables rodeadas por% (es decir,% SITEDESCR%) Estas son las palabras que deseo reemplazar y luego guarde el XML en un nuevo archivo. Cualquier ayuda o sugerencia sería genial.Buscar y reemplazar valores en XML usando Python

Gracias, Mike

<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

Tome un analizador XML decente, analice el XML, encuentre los nodos, vuelva a escribir el archivo ... ¿dónde está el problema? –

+1

Analizador de +1 a xml. Me gusta lxml 'easy_install lxml' – matchew

+0

posible duplicado de [Los mejores analizadores XML de plataforma cruzada para Python] (http://stackoverflow.com/questions/451057/best-cross-platform-xml-parsers-for-python) –

Respuesta

28

Los fundamentos:

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) 

se puede acortar el camino si la etiqueta el nombre es único Esta sintaxis encuentra el primer nodo en cualquier nivel de profundidad en el árbol.

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

Además, lea el documentation, esp. el soporte XPath para localizar nodos.

+0

Hola, gracias Mark. Esto es exactamente lo que estaba buscando. Esto funciona con mi programa existente de python. – Mike

2

Si lo que desea es reemplazar los bits incluidos con %, entonces esto no es realmente un problema XML. Puede hacerlo fácilmente con expresiones regulares:

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

Probé esto en una secuencia de comandos independiente y esto funciona bien. Agregaré esto a mi biblioteca de Python para referencia futura. Gracias por responder. – Mike

0

Juste leer el archivo línea por línea y reemplazar:

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

¡Esto también funciona! ¡Aprecio la retroalimentación positiva! – Mike

+0

Esto puede ser frágil: los archivos XML no son solo texto. El espacio en blanco generalmente no es importante en XML, por lo que un cambio en el archivo de entrada puede dar como resultado un XML idéntico que su código no reconoce. –

+0

no hay espacios en blanco en los marcadores de posición% something%, solo agregaría codificar caracteres especiales XML, especialmente < and > si es necesario –

Cuestiones relacionadas