--- Actualización 3: Tengo la secuencia de comandos para actualizar los datos requeridos en los archivos xml completados, pero el siguiente código se descarta del archivo escrito. ¿Por qué es esto? ¿cómo puedo reemplazarlo?Buscar y reemplazar varias líneas en archivos xml/texto usando python
<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type='text/xsl' href='ANZMeta.xsl'?>
Código de trabajo actual (excepto por el problema mencionado anteriormente).
import os, xml, arcpy, shutil
from xml.etree import ElementTree as et
path=os.getcwd()
arcpy.env.workspace = path
FileList = arcpy.ListFeatureClasses()
FileCount = len(FileList)
zone="_Zone"
for File in FileList:
FileDesc_obj = arcpy.Describe(File)
FileNm=FileDesc_obj.file
newMetaFile=FileNm+"_BaseMetadata.xml"
check_meta=os.listdir(path)
if FileNm+'.xml' in check_meta:
shutil.copy2(FileNm+'.xml', newMetaFile)
else:
shutil.copy2('L:\Data_Admin\QA\Metadata_python_toolset\Master_Metadata.xml', newMetaFile)
tree=et.parse(newMetaFile)
print "Processing: "+str(File)
for node in tree.findall('.//title'):
node.text = str(FileNm)
for node in tree.findall('.//northbc'):
node.text = str(FileDesc_obj.extent.YMax)
for node in tree.findall('.//southbc'):
node.text = str(FileDesc_obj.extent.YMin)
for node in tree.findall('.//westbc'):
node.text = str(FileDesc_obj.extent.XMin)
for node in tree.findall('.//eastbc'):
node.text = str(FileDesc_obj.extent.XMax)
for node in tree.findall('.//native/nondig/formname'):
node.text = str(os.getcwd()+"\\"+File)
for node in tree.findall('.//native/digform/formname'):
node.text = str(FileDesc_obj.featureType)
for node in tree.findall('.//avlform/nondig/formname'):
node.text = str(FileDesc_obj.extension)
for node in tree.findall('.//avlform/digform/formname'):
node.text = str(float(os.path.getsize(File))/int(1024))+" KB"
for node in tree.findall('.//theme'):
node.text = str(FileDesc_obj.spatialReference.name +" ; EPSG: "+str(FileDesc_obj.spatialReference.factoryCode))
print node.text
projection_info=[]
Zone=FileDesc_obj.spatialReference.name
if "GCS" in str(FileDesc_obj.spatialReference.name):
projection_info=[FileDesc_obj.spatialReference.GCSName, FileDesc_obj.spatialReference.angularUnitName, FileDesc_obj.spatialReference.datumName, FileDesc_obj.spatialReference.spheroidName]
print "Geographic Coordinate system"
else:
projection_info=[FileDesc_obj.spatialReference.datumName, FileDesc_obj.spatialReference.spheroidName, FileDesc_obj.spatialReference.angularUnitName, Zone[Zone.rfind(zone)-3:]]
print "Projected Coordinate system"
x=0
for node in tree.findall('.//spdom'):
for node2 in node.findall('.//keyword'):
print node2.text
node2.text = str(projection_info[x])
print node2.text
x=x+1
tree.write(newMetaFile)
--- Actualización 1 & 2: Gracias a Aleyna Tengo el siguiente código básico que funciona
import os, xml, arcpy, shutil
from xml.etree import ElementTree as et
CodeString=['northbc','southbc', '<nondig><formname>']
nondig='nondigital'
path=os.getcwd()
arcpy.env.workspace = path
xmlfile = path+"\\test.xml"
FileList = arcpy.ListFeatureClasses()
FileCount = len(FileList)
for File in FileList:
FileDesc_obj = arcpy.Describe(File)
FileNm=FileDesc_obj.file
newMetaFile=FileNm+"_Metadata.xml"
shutil.copy2('L:\Data_Admin\QA\Metadata_python_toolset\Master_Metadata.xml', newMetaFile)
tree=et.parse(newMetaFile)
for node in tree.findall('.//northbc'):
node.text = str(FileDesc_obj.extent.YMax)
for node in tree.findall('.//southbc'):
node.text = str(FileDesc_obj.extent.YMin)
for node in tree.findall('.//westbc'):
node.text = str(FileDesc_obj.extent.XMin)
for node in tree.findall('.//eastbc'):
node.text = str(FileDesc_obj.extent.XMax)
for node in tree.findall('.//native/nondig/formname'):
node.text = nondig
tree.write(newMetaFile)
El problema es con el trato con el código XML como
- <spdom>
<keyword thesaurus="">GDA94</keyword>
<keyword thesaurus="">GRS80</keyword>
<keyword thesaurus="">Transverse Mercator</keyword>
<keyword thesaurus="">Zone 55 (144E - 150E)</keyword>
</spdom>
Como la palabra clave thes ... no es única dentro de <spdom>
podemos actualizar estos en un orden de los valores provenientes de
FileDesc_obj.spatialReference.name
u'GCS_GDA_1994'
--- --- post original
estoy construyendo un programa para generar archivos XML de metadatos de los archivos espaciales en nuestra biblioteca. Ya he creado las secuencias de comandos para extraer los datos espaciales y alterados requeridos de los archivos y crear un archivo basado en archivos shp y de texto de los archivos, pero ahora quiero escribir esta información en el archivo base metadata xml que se escribe en estándares anzlic reemplazando los valores de los elementos comunes/estáticas ...
Así, por ejemplo, que quieren reemplazar el siguiente código XML
<northbc>8097970</northbc>
<southbc>8078568</southbc>
con
<northbc> GeneratedValue_[desc.extent.XMax] /<northbc>
<southbc> GeneratedValue_[desc.extent.XMax] </southbc>
la cuestión es que, obviamente, el número/valor entre y no será lo mismo.
De forma similar para las etiquetas xml como <title>, <nondig><formname>
etc ... en el último ejemplo ambas etiquetas deben buscarse juntas ya que formname aparece varias veces (no es único).
estoy usando el pitón manual de expresiones regulares [aquí] [1],
Ver http://stackoverflow.com/a/1732454/383402 – Borealid
gracias ... No estoy tratando de escribir un archivo XML desde cero. Solo quiero reemplazar trozos de texto dentro de atributos dados basados en la entrada del módulo arcpy. – GeorgeC
Así que cuando se produce una salida que se parece a ' 8097970 ', su expresión regular manejarlo? –
Borealid