• No se han encontrado resultados

Ejecutar scripts Python

In document Manual de referencia y del usuario (página 165-171)

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

In document Manual de referencia y del usuario (página 165-171)