Interfaz Python Altova RaptorXML Server
151Interfaz Python
5.2 Ejecutar scripts Python
Para pasar scripts Python a RaptorXML Server es necesario suministrar la URL del script como valor de la opción --script. La opción --script es compatible con estos comandos:
valxml-withxsd (xsi) valxsd (xsd)
Estos comandos se pueden usar tanto en la interfaz de la línea de comandos como en la interfaz HTTP.
Ejemplos
Aquí puede ver algunos ejemplos de uso de estos comandos:
raptorxml xsi --script=xml.py --streaming=false c:\TieneRefXSD.xml raptorxml xsd --script=xsd.py c:\Prueba.xsd
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ó.
Iniciar el script
Una vez suministrado el comando y validados los archivos, RaptorXML Server llama a la función Python de punto de entrada correspondiente al comando que acaba de ejecutar y le suministra los valores de los dos argumentos de la función. Si la función de punto de entrada se define en el script con el parámetro --script, entonces se inicia la ejecución del script.
156 Interfaz Python Ejemplo de script 1: procesar XML
© 2014 Altova Gmb H
Altova RaptorXML Server 2014
5.3
Ejemplo de script 1: procesar XML
Este script Python procesa los datos del archivo NanonullOrg.xml (situado en la carpeta
examples de la carpeta de aplicación de RaptorXML) y crea un documento de salida llamado summary.html. El archivo de salida contiene una tabla que muestra el número total de acciones que poseen los empleados de cada departamento.
El script se pasa en la ILC con este comando:
raptorxml xsi --streaming=false --script=sharesummary.py NanonullOrg.xml
En este apartado puede encontrar: El script Python con anotaciones
© 2014 Altova Gmb H
Ejemplo de script 1: procesar XML 157 Interfaz Python
Altova RaptorXML Server 2014
5.3.1
Script
El script Python con anotaciones que aparece más abajo procesa los datos del archivo
NanonullOrg.xml (situado en la carpeta examples de la carpeta de aplicación de RaptorXML) y crea un documento de salida llamado summary.html. Este archivo de salida contiene una tabla que muestra el número total de acciones que poseen los empleados de cada departamento. El script se puede pasar a RaptorXML con este comando:
raptorxml xsi --streaming=false --script=sharesummary.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: sharesummary.py
import os
from altova import xml def getElemTextValue(elem):
"""Devuelve el contenido de texto de un elemento XML"""
text = ''
for child in elem.children:
if isinstance(child,xml.Character): text += child.character_code return text
def getChildElemsWithName(elemParent,name):
"""Devuelve una lista con todos los elementos secundarios que tienen este nombre"""
elems = []
for child in elemParent.children:
if isinstance(child,xml.Element) and child.local_name == name: elems.append(child)
return elems
def getDepartmentName(elemDepartment):
"""Devuelve el nombre del departamento indicado en el elemento <Name>"""
return getElemTextValue(getChildElemsWithName(elemDepartment,'Name')[0])
def getDepartmentTotalShares(elemDepartment):
"""Devuelve el número de acciones que posee cada miembro del departamento"""
# Inicializar total de acciones en 0 totalShares = 0
158 Interfaz Python Ejemplo de script 1: procesar XML
© 2014 Altova Gmb H
Altova RaptorXML Server 2014
# Sumar las acciones de cada <Person> del departamento
for elemPerson in getChildElemsWithName(elemDepartment,'Person'): elemShares = getChildElemsWithName(elemPerson,'Shares')
# El elemento <Shares> es opcional. Por eso es necesario comprobar si existe
if len(elemShares):
# Obtener el valor del elemento <Shares>, convertirlo en un entero y añadirlo a la suma total
totalShares += int(getElemTextValue(elemShares[0])) return totalShares
def calcSharesPerDepartment(instance):
"""Devuelve un mapa con el número de acciones que poseen los miembros del departamento"""
# Obtener el elemento XML raíz
elemOrgChart = instance.document.document_element # Comprobar si el elemento raíz es <OrgChart>
if not elemOrgChart or elemOrgChart.local_name != 'OrgChart' or
elemOrgChart.namespace_name != 'http://www.xmlspy.com/schemas/orgchart': # Si no lo es, emitir un error
raise Error('This script must be used with a valid OrgChart instance!')
mapSharesPerDepartment = {}
# Recorrer cada elemento <Department> de cada <Office> y establecer el número de acciones que poseen los miembros del departamento
for elemOffice in getChildElemsWithName(elemOrgChart,'Office'):
for elemDepartment in getChildElemsWithName(elemOffice,'Department'): mapSharesPerDepartment[getDepartmentName(elemDepartment)] =
getDepartmentTotalShares(elemDepartment) return mapSharesPerDepartment
def writeSummary(mapSharesPerDepartment,filename):
"""Escribe un resumen en el nombre de archivo indicado con el número de acciones para cada departamento"""
# Abrir el archivo para escribir f = open(filename,'w')
f.write('<html><title>Summary</title><body><table border="1">\n') f.write('<tr><th>Department</th><th>Shares</th></tr>\n')
# Generar una fila de tabla por cada departamento con el nombre del departamento y su número de acciones
for name,shares in sorted(mapSharesPerDepartment.items()): f.write('<tr><td>%s</td><td>%d</td></tr>\n'%(name,shares)) f.write('</table></body></html>\n')
# Cerrar el archivo 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"""
© 2014 Altova Gmb H
Ejemplo de script 1: procesar XML 159 Interfaz Python
Altova RaptorXML Server 2014 # Crear el archivo 'summary.html' 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,'summary.html')
# Calcular el número de acciones por departamento y escribir un resumen en 'summary.html'
writeSummary(calcSharesPerDepartment(instance),filename)
# Registrar el archivo de salida 'summary.html' recién generado job.append_output_filename(filename)
160 Interfaz Python Ejemplo de script 1: procesar XML
© 2014 Altova Gmb H
Altova RaptorXML Server 2014
5.3.2
Documento de resultados
A continuación aparece un fragmento del documento de salida summary.html generado por el script Python sharesummary.py.
Nombre de archivo: summary.html
<html><title>Summary</title><body> <table border="1">
<tr><th>Department</th><th>Shares</th></tr> <tr><td>Administration</td><td>2500</td></tr> <tr><td>Engineering</td><td>5500</td></tr>
<tr><td>IT & Technical Support</td><td>1750</td></tr> <tr><td>Marketing</td><td>3000</td></tr>
<tr><td>Research & Development</td><td>5500</td></tr> </table>
© 2014 Altova Gmb H
Ejemplo de script 2: cambiar el formato XML 161 Interfaz Python
Altova RaptorXML Server 2014