Muy buenas a todos, llevo varios días por no decir semanas intentado parsear unos archivos xml siguiendo los ejemplos de foro y en especial de Paco Santué y algo voy consiguiendo. El problema es que necesito parsear varios xml con diferentes y multiples nodos. Siguiendo el ejemplo de paco se puede extraer los datos del nodo principal pero en cuanto hay nodos y subnodos no consigo leerlos. Otra cosa es que de javascript tengo muy poca idea por lo que no se ni por donde cogerlo
Para extraer los datos de cod_nacion, nro_definitivo y otros que esten por debajo no hay problema pero como accedo a los nodos formasfarmaceuticas y composicion_pa
Buenas
No sé si habras resuelto el problema, pero te doy una solución que me sirvió, haciendo pruebas para leer XML. Aclaro que no uso el de Velneo, por que no me entero ni de la mitad.
Es una librería de JavaScript (un poco modificada para Velneo, por el tema de la versión de JavaScript)
que te permite convertir un arbol XML a una estructura JSON sencilla, la verdad es que va muy bien y te ahorraras tiempo, con los comandos nativos de JSON de velneo lo manejaras muy facilmente
Poniendote un ejemplo básico a modo de prueba:
// Tengo este XML
<persona>
<nombre>Fran</nombre><apellidos>Garcia</apellidos>
<fecha_nacimiento>
<dia>11</dia>
<mes>7</mes>
<anno>2000</anno>
</fecha_nacimiento>
<ciudad>Alicante</ciudad>
</persona>
Que sería algo así como tus medicamentos, es decir un nodo dentro de otro nodo, que contiene una propiedades.
Bien pues usando la librería quedaría algo así
#include "(CurrentProject)/js/parser.js"
var response = "<persona><nombre>Fran</nombre><apellidos>Garcia</apellidos><fecha_nacimiento><dia>11</dia><mes>7</mes><anno>2000</anno></fecha_nacimiento><ciudad>Alicante</ciudad></persona>";
var myXML = parser(response);
alert(JSON.stringify(myXML));
// La salida sería así
{
"persona": {
"nombre": "Fran",
"apellidos": "Garcia",
"fecha_nacimiento": {
"dia": 11,
"mes": 7,
"anno": 2000
},
"ciudad": "Alicante"
}
}
Y ya podrías trabajarlo con los comandos de Velneo… ahora viene el ejemplo de tu caso
// Tengo este xml
<prescription>
<cod_nacion>010101</cod_nacion>
<nro_definitivo>2020</nro_definitivo>
<formasfarmaceuticas>
<cod_forfar>288</cod_forfar>
</formasfarmaceuticas>
<composicion_pa>
<otro_elemento>uno</otro_elemento>
</composicion_pa>
<composicion_pa>
<otro_elemento>dos</otro_elemento>
</composicion_pa>
</formasfarmaceuticas>
</prescription>
// Te quedaría algo así
{
"prescription": {
"cod_nacion": 10101,
"nro_definitivo": 2020,
"formasfarmaceuticas": {
"cod_forfar": 288
},
"composicion_pa": [{
"otro_elemento": "uno"
}, {
"otro_elemento": "dos"
}]
}
}
Y ya lo puedes manejar a tu gusto, te adjunto la librería por si la quieres probar
parser.qml (49,8 KB)
PD: El archivo lo he subido en formato .qml para que me dejes subirlo, luego lo debes renombrar a .js
Saludos
Hola.
Es cierto que las funciones de gestión XML de Velneo son producto de un mal día de diseño y un peor ejemplo de Documentación, LifeIsSoft y LowCode.
En cualquier caso, una vez que entiendas la lectura secuencial que ejecuta la clase VXmlReader (funciones readNext y readNextStartElement) la cosa se hace más fácil.
Podéis ver ejemplos en la aplicación 0PS_MiAPI de Ejercicios con Velneo, en la rama XML.
Saludos
Paco Satué
Muchas gracias por la respuesta y una cosita paco tu que veo que entiendes algo mas que los mortales que te rodean, podrias explicarte un poco mas cuando hablas de la lectura secuencial que ejecuta la clase VXml Reader y las funciones readNext y readNext StarElemen que diferencia hay exactamente entre ellas y como se puede recorrer por ejemplo todos los nodos y subnodos de la extructura xml que he puesto como ejemplo. y gracias de antemano
Fran gracias por el codigo lo echare un vistazo a ver que saco en claro, Gracias
Hola lsmsusvilla.
Tendría que darte un curso detallado de informática básica.
La lectura secuencial de cadenas de texto, o de “streams” en general, son la base de funcionamiento del proceso de información desde los años 60 del siglo pasado.
Por eso la clase VXmlReader de entrada es un poco vintage, pero muy versátil para tratamientos sencillos de XML y de gran rapidez para procesar megabytes de datos.
Estudia los sencillos ejemplos de los Ejercicios con Velneo y seguro que vez la luz.
Saludos
Paco Satué
Ok le echare un vistazo y te ire diciendo una pregunta rapida en javascript al final de cada intruccion se pone ; pero e visto que en velneo tambien funciona si ellas. Y cual seria el equivalente en javascript al choose de velneo.
Una cosa fran cuando voy a ejecutar el script parser.js tal y como me lo has pasado, me da error en varias lineas y no funciona. De que puede ser
Debes de ejecutarlo desde un proceso de Velneo con el comando Ejecutar filescript, si lo estás haciendo así, hazmelo saber y te paso el VIN con el ejemplo, así lo tendrás claro. Si se ejecutar mediante un proceso de Velneo Javascript, deja de funcionar puesto que su versión de javascript es muy muy vieja y la mayoría de funciones dejan de ir
Muy buenas Fran, no se si estare haciendo algo mal lo estoy ejecutando tal y como dices y me sigue dando error. Mira si por favor me puedes mandar el VIN para ver si me aclaro.
xml_prueba.vin (58,3 KB)
Ahí esta
Hola lsmsusvilla.
Cuelga en este hilo un XML de los que vayas a procesar y plantea una consulta sobre las ramas de dicho XML. Hacemos el ejercicio con la clase VXmlReader para que tengas un ejemplo real de uso.
Saludos
Paco Satué
Pues por ejemplo uno de los archivos xml que tengo que manejar seria este con multitud de registros iguales que los dos que hay de ejemplo con multitud de nodos. Cmabiar la extensión por xml
Recibos (compartir).qml (166,4 KB)
Gracias cualquier ayuda sugerencia será de agradecer ya que en esto de javascript estoy un poco verde
Hola lsmsusvilla.
Suponiendo que conoces la estructura de los datos XML, tienes que plantear una consulta para hacer el ejercicio sobre eso.
Saludos
Paco Satué
Buenas paco, cuando dices de plantear una consulta te refieres a soporte?
Hola lsmsusvilla.
Lo que quiero es que nos digas exactamente qué datos quieres obtener del XML.
Por ejemplo:
- Obtener la FechaCreacion
- Obtener la cantidad de Recibos
- Obtener la lista de los valores de IdRecibo
- Obtener los MovimientosRecibo de un determinado Recibo
- …
Conociendo la estructura del XML, podemos recorrerla desde el inicio al final buscando y leyendo esos valores.
Saludos
Paco Satué
Perdona no te habia entendido, pues en un principio todos y cada uno de los campos de los nodos Recibo, empezando por el principio , hasta el ultimo . Siguiendo el ejemplo que tienes en Cosas de… lo que no consigo es posicionar el cursor en el primer nodo donde tiene que empezar a leer. Luego no tengo claro como puedo ir navegando entre nodos subnodos y sub sub nodos para extraer los datos. El objetivo es con los datos de xml dar de alta todos los campos en las tablas de velneo con todos sus campos.
Hola lsmsusvilla.
He preparado el ejercicio de procesamiento con el XML que has proporcionado.
Es posible procesar el XML a velocidad del rayo usando las funciones readNext, readNextStartElement y skipCurrentElement de la clase VXmlReader.
Para indicar el elemento que deseamos procesar he usado un formato parecido al JSON. Separamos la cadena de Nodos usando un punto e indicamos el número del elemento con corchetes.
- Obtener el valor de IdRecibo del segundo Recibo del XML (Recibo[1])
- Obtener los valores de las Fechas de los Datos del segundo Recibo
- Obtener los Movimientos del primer Recibo
Los resultados se devuelven en formato JSON para que sean fácilmente incorporados a una tabla Velneo.
Dispones del código en los Ejercicios con Velneo de la aplicación 0PS_MiAPI (8. XML - Procesar Recibos).
Saludos
Paco Satué