Interfaz Python Altova RaptorXML Server
151Interfaz Python
5.4 Ejemplo de script 2: cambiar el formato XML
El script Python de este ejemplo cambia el formato del archivo XML NanonullOrg.xml (situado en la carpeta examples de la carpeta de aplicación de RaptorXML). A cada elemento se le aplica una sangría con tabulaciones y cada atributo se coloca en una línea nueva (lo cual facilitará la comparación visual cuando se utilice un programa de diferenciación). El documento de salida se llama output.xml.
El script se pasa en la ILC con este comando:
raptorxml xsi --streaming=false --script=reformat.py NanonullOrg.xml
En este apartado puede encontrar: El script Python con anotaciones
162 Interfaz Python Ejemplo de script 2: cambiar el formato XML
© 2014 Altova Gmb H
Altova RaptorXML Server 2014
5.4.1
Script
El script Python con anotaciones que aparece a continuación (reformat.py) cambia el formato del archivo XML NanonullOrg.xml (situado en la carpeta examples de la carpeta de aplicación de RaptorXML). A cada elemento se le añade sangría con tabulaciones y cada atributo se coloca en una línea nueva (lo cual facilita la comparación visual en programas de diferenciación de datos). El documento de salida se llama output.xml.
El script se pasa en la ILC con este comando:
raptorxml xsi --streaming=false --script=reformat.py NanonullOrg.xml
Nota: cuando use la opción --script con el comando valxml-withxsd, asegúrese de
especificar --streaming=false. De lo contrario se genera una advertencia diciendo que el script no se ejecutó.
Nombre de archivo: reformat.py
import os
from altova import xml, xsd def writeCharacter(f,char,depth):
"""Generar XML para el nodo de caracteres"""
# Ignorar los nodos de texto que contienen solo caracteres de espacios en blanco
if not char.element_content_whitespace: # Escribir el contenido de texto
f.write("\t"*depth + char.character_code+'\n')
def writeComment(f,comment,depth):
"""Generar XML para el nodo de comentario"""
# Escribir el comentario
f.write("\t"*depth + '<!-- '+comment.content+'-->\n')
def writeAttribute(f,attr,depth):
"""Generar XML para el nodo de atributo (en una línea nueva)"""
# Buscar prefijo para el espacio de nombres en el mapa de espacios de nombres inscope
prefix = None
if attr.namespace_name: inscope = {}
for namespace in attr.owner_element.inscope_namespaces: inscope[namespace.namespace_name] = namespace.prefix prefix = inscope[attr.namespace_name]
if prefix:
prefix += ':' if not prefix:
© 2014 Altova Gmb H
Ejemplo de script 2: cambiar el formato XML 163 Interfaz Python
Altova RaptorXML Server 2014 prefix = ''
# Escribir el atributo con su valor
f.write("\t"*depth + "@"+prefix+attr.local_name+"=\""+attr.normalized_value +"\"\n")
def writeNSAttribute(f,attr,depth):
"""Generar XML para el nodo de atributo de espacio de nombres (en una línea nueva)"""
prefix = ""
if attr.local_name != 'xmlns': prefix = 'xmlns:'
# Escribir el atributo de espacio de nombres con su valor
f.write("\t"*depth + "@"+prefix+attr.local_name+"=\""+attr.normalized_value +"\"\n")
def writeChildren(f,elem,depth):
"""Generar XML para todos los nodos secundarios (con sangría según el nivel jerárquico)"""
# Iterar en todos los nodos secundarios for child in elem.children:
if isinstance(child,xml.Element): writeElement(f,child,depth) elif isinstance(child,xml.Comment): writeComment(f,child,depth) elif isinstance(child,xml.Character): writeCharacter(f,child,depth) def writeElement(f,elem,depth):
"""Generar XML para el nodo de elemento con todos sus nodos secundarios (con sangría según el nivel jerárquico)"""
# Buscar prefijo para el espacio de nombres en el mapa de espacios de nombres inscope
prefix = None
if elem.namespace_name: inscope = {}
for namespace in elem.inscope_namespaces:
inscope[namespace.namespace_name] = namespace.prefix prefix = inscope[elem.namespace_name] if prefix: prefix += ':' if not prefix: prefix = '' if len(list(elem.attributes)) + len(list(elem.namespace_attributes)) == 0: # Escribir la etiqueta de apertura entera (sin atributos)
f.write("\t"*depth + "<"+prefix+elem.local_name+'>\n') else:
164 Interfaz Python Ejemplo de script 2: cambiar el formato XML
© 2014 Altova Gmb H
Altova RaptorXML Server 2014
f.write("\t"*depth + "<"+prefix+elem.local_name+'\n')
# Escribir los atributos de espacio de nombres en líneas nuevas for attr in elem.namespace_attributes:
writeNSAttribute(f,attr,depth+1) # Escribir atributos en líneas nuevas for attr in elem.attributes:
writeAttribute(f,attr,depth+1) # Cerrar la etiqueta de apertura f.write("\t"*depth + ">\n")
# Escribir todos los secundarios del elemento writeChildren(f,elem,depth+1)
# Escribir la etiqueta de cierre
f.write("\t"*depth + "</"+prefix+elem.local_name+">\n")
def writeInstance(instance,filename):
"""Generar XML para la instancia dada, donde cada elemento tiene sangría de tabulaciones y cada atributo aparece en una línea nueva"""
# Abrir archivo de salida f = open(filename,'w')
# Escribir el contenido de la instancia XML writeChildren(f,instance.document,0)
# Cerrar el archivo de salida f.close()
def on_xsi_valid(job,instance):
"""Este método será invocado automáticamente por RaptorXML una vez finalizada la validación de la instancia XML"""
# Crear el archivo 'output.xml' en el directorio de salida del trabajo (cuando se ejecute desde la ILC, crear en el directorio de trabajo actual) filename = os.path.join(job.output_dir,'output.xml')
# Escribir una versión del XML de instancia con otro formato: cada atributo aparece en una línea nueva
writeInstance(instance,filename)
# Registrar el archivo de salida 'output.html' recién generado job.append_output_filename(filename)
© 2014 Altova Gmb H
Ejemplo de script 2: cambiar el formato XML 165 Interfaz Python
Altova RaptorXML Server 2014
5.4.2
Documento de resultados
A continuación aparece un fragmento del documento de salida output.html generado por el script Python reformat.py.
Nombre de archivo: output.xml
<OrgChart
@xmlns="http://www.xmlspy.com/schemas/orgchart"
@xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
@xmlns:ipo2="http://www.altova.com/IPO"
@xmlns:ts="http://www.xmlspy.com/schemas/textstate"
@xsi:schemaLocation="http://www.xmlspy.com/schemas/orgchart OrgChart.xsd" > <CompanyLogo @href="http://www.altova.com/nanonull.gif" > </CompanyLogo> <Name> Organization Chart </Name> <Office> <Name> Nanonull, Inc. </Name> <Desc> <para>
The company was established <Style
@css="font-weight: bold" >
in Beverly in 1995 </Style>
as a privately held software company. Since 1996, Nanonull has been actively involved in developing nanoelectronic software technologies. It released the first version of its acclaimed
<Style
@css="font-style: italic" >
NanoSoft Development Suite </Style>
in February 1999. Also in 1999, Nanonull increased its capital base with investment from a consortium of private investment firms. The company has been expanding rapidly ever since.
</para> <para>
Due to the fact that nanoelectronic software components are new and that sales are restricted to corporate customers, Nanonull and its product line have not received much media publicity in the company's early years. This has however changed in recent months as trade journals have realized the importance of this revolutionary technology.
166 Interfaz Python Ejemplo de script 2: cambiar el formato XML
© 2014 Altova Gmb H
Altova RaptorXML Server 2014 </Desc> <Location> US </Location> <Address @xsi:type="ipo2:US-Address" > <ipo2:street @xmlns:ipo="http://www.altova.com/IPO" > 900 Cummings Center </ipo2:street> <ipo2:city> Boston </ipo2:city> <ipo2:state> MA </ipo2:state> <ipo2:zip> 3234 </ipo2:zip> </Address> <Phone> +1 (321) 555 5155 0 </Phone> <Fax> +1 (321) 555 5155 4 </Fax> <EMail> [email protected] </EMail> <Department> <Name> Administration </Name> <Person @union="fred" > <First> Vernon </First> <Last> Callaby </Last> <Title> Office Manager </Title> <PhoneExt> 582 </PhoneExt> <EMail> [email protected] </EMail>
© 2014 Altova Gmb H
Ejemplo de script 2: cambiar el formato XML 167 Interfaz Python
Altova RaptorXML Server 2014 <Shares> 1500 </Shares> <LeaveTotal> 25 </LeaveTotal> <LeaveUsed> 4 </LeaveUsed> <LeaveLeft> 21 </LeaveLeft> <union> 3 </union> <list> abc def </list> <bool> true </bool> <idref> fred </idref> <idrefs> fred joe </idrefs> <entity> myUnparsedEntity </entity> <notation> Altova-Orgchart </notation> </Person> ... </Department> ... </Office> ... </OrgChart>
168 Interfaz Python API de Python: el objeto Job
© 2014 Altova Gmb H
Altova RaptorXML Server 2014