Anda di halaman 1dari 9

Articulo 0002

http://www.gixml.com
21 de agosto de 2001

GIXML.COM
GENERANDO DOCUMENTOS EN XML CON VISUAL BASIC
Juan Jos Riera Esteban. Grupo de Inters en XML.
Agosto 2001

Material reproducido para fines acadmicos, prohibida su reproduccin sin la autorizacin de los titulares de los derechos. 2001 Copyright GIXML. http://www.gixml.com

www.detodoprogramacion.com

Generando documentos en XML con Visual Basic


Juan Jos Riera. Phoenix/Linx casa de software Gixml.com. jujorie@hotmail.com

Abstracto
Usando modelo de objetos de documento (DOM) junto con Visual Basic se puede construir una poderosa herramienta de creacin de documentos XML que puede ser usada para generar y administrar su propio boletn en lnea por suscripcin. Algunos de estos conceptos tambin se pueden aplicar a VBScript de hecho se tratar de hacer las acotaciones necesarias para esta conversin.

Introduccin
Usando los conocimientos adquiridos con Visual Basic (VB) y una que otra habilidad en el manejo de interfaces de documentos se pueden lograr hacer piezas de software sencillas pero muy tiles a la hora de hacer un trabajo en XML. Con este pequeo articulo me gustara mostrar como elaborar una aplicacin que puede servir de punto de inicio para una ms compleja o un producto comercial que use tecnologa de punta. Antes de empezar cualquier programa uno, como programador, debe plantearse cual es el objetivo que se debe cumplir para obtener un trabajo satisfactorio. En nuestro caso la misin es tomar un documento XML cualquiera, procesarlo a travs de una plantilla XSLT para obtener as un nuevo documento, que puede ser o un archivo HTML, otro documento XML, o simple mente una informacin que pueda ser usada por otra aplicacin. Esto suena complicado, pero no es as, es ms sencillo de lo que aparenta. Para ilustrar podemos ver una imagen del proceso que queremos programar:

GIXML.COM
Documento HTML Archivo origen XML Generador en Visual Basic Archivo de plantila XSL Cualquier Documento Copyright (c) 2001 Juan Jos Riera Documento XML

Fig. 1 Proceso de combinacin

Requerimientos
Este articulo asume que se tiene algn conocimiento en Visual Basic y COM. Para ejecutar los ejemplos se requiere Visual Basic 5 o 6 y Interpretador de XML 1.0 o superior de Microsoft.

Material reproducido para fines acadmicos, prohibida su reproduccin sin la autorizacin de los titulares de los derechos. 2001 Copyright GIXML. http://www.gixml.com

www.detodoprogramacion.com

Creando la aplicacin
Nuestro programa es un ejecutable hecho en VB. Podemos empezar abriendo el VB y eligiendo un nuevo proyecto ejecutable estndar. Para nuestra aplicacin requeriremos de algunos controles estndares de Windows tal como se muestran en la figura siguiente:

GIXML.COM
Fig. 2: La pantalla de ejemplo en el entorno de Visual Basic Bsicamente se tienen dos cuadros de texto que nos servirn para obtener el nombre de los archivos que queremos combinacin, un botn que ejecuta la combinacin y unas opciones de destino. Esta es la parte de carpintera ahora veamos como se hace para que el formulario nos sirva para generar nuevos documentos XML.

Los documentos XML


Para poder trabajar con XML dentro de VB tenemos dos opciones, una es usando la referencia de la librera del Interpretador de XML y otra es solicitando los objetos al DOM. Ambas opciones funcionan de manera similar, lo que cambia es cmo se declaran las variables. En nuestro caso usaremos la referencia directa a la librera de XML (MSXML3.DLL que es el interpretador de Microsoft). Para hacer esto debemos tener instalada en la mquina este interpretador, si no lo tiene vea en la seccin de enlaces de este artculo. Agreguemos la referencia a la librera correspondiente. Del men Proyecto de VB seleccione la opcin Referencias. En el cuadro de dilogo que aparece ubique la referencia Microsoft XML, v3.0. si sta referencia no existe haga clic en el botn examinar y ubique el archivo que se mencion anteriormente (MSXML3.DLL).

Material reproducido para fines acadmicos, prohibida su reproduccin sin la autorizacin de los titulares de los derechos. 2001 Copyright GIXML. http://www.gixml.com

www.detodoprogramacion.com

Fig. 3: La referencia a XML en Visual Basic Dentro de Visual Basic un documento XML es modelado por una instancia de la clase DOMDocument, por lo tanto si queremos declarar una variable que albergar tal documento tendra que ser de la siguiente forma:

GIXML.COM
Dim xmlOrigen as DOMDocument Si deseamos cargar un documento XML que ya existe en disco podramos completar la tarea con el siguiente bloque de cdigo: Dim xmlOrigen as DOMDocument Set xmlOrigen = new DOMDocument xmlOrigen.Async = False xmlOrigen.ValidateOnParse = False If xmlOrigen.Load(Archivo.xml) Then Se pudo cargar Else No se pudo cargar Endif
VB 5 o VB 6: Cargar un documento XML

La propiedad Async indica si la carga del archivo se va hacer asncrona o manera sncrona, es decir si se continua con la ejecucin del programa mientras se carga el documento o detener la ejecucin del programa hasta haber cargado todo el documento. Para nuestro ejemplo lo haremos de manera sncrona. De manera similar, la propiedad ValidateOnParse indica que se debe validar la estructura del rbol XML a medida que se cargue o que una vez cargado se valide completo. Ahora necesitamos cargar la plantilla de la misma manera que se hizo con el documento maestro. De hecho un documento de plantilla tambin es un documento XML vlido, por esta razn se carga de la misma manera.

Material reproducido para fines acadmicos, prohibida su reproduccin sin la autorizacin de los titulares de los derechos. 2001 Copyright GIXML. http://www.gixml.com

www.detodoprogramacion.com

Haciendo la Combinacin
Una vez cargados los dos documentos XML en sus respectivos objetos de memoria se pueden combinacin o combinar para crear un nuevo documento. Dependiendo de cmo se construya el archivo de plantilla se pueden generar desde otros documentos XML a cualquier otro tipo de documento que puede ser un archivo HTML otro archivo XSL o un documento de texto. Para combinar los documentos podemos usar el mtodo TransformNode que esta incluido en la clase DOMDocument. Este mtodo toma como parmetro otro documento XML, lo que podra ser:

strXML = xmlOrigen.TransformNode(xmlPlantilla)

Con esta sencilla lnea hemos creado un rbol XML nuevo u otro tipo de documento dentro de una variable de texto. Todo el conjunto bsico para hacer una combinacin de archivos XML ser entonces de la siguiente forma:

Dim xmlOrigen Dim xmlPlantilla Dim strXML

as DOMDocument as DOMDocument as String

GIXML.COM
If xmlOrigen.Load(Archivo.xml) Then Set xmlPlantilla = new DOMDocument xmlPlantilla.Async = False xmlPlantilla.ValidateOnParse = False If xmlPlantilla.Load(Archivo.xsl) then strXML = xmlOrigen.TransformNode(xmlPlantilla) No se pudo cargar End If Else No se pudo cargar Endif
VB 5 o VB 6: Hacer la combinacin de los archivos XML

Set xmlOrigen = new DOMDocument xmlOrigen.Async = False xmlOrigen.ValidateOnParse = False

Else

Material reproducido para fines acadmicos, prohibida su reproduccin sin la autorizacin de los titulares de los derechos. 2001 Copyright GIXML. http://www.gixml.com

www.detodoprogramacion.com

Un poco ms all
Este mismo cdigo con algunas modificaciones se puede usar en ASP con Visual Basic Script (VBS) haciendo slo unas pequeas modificaciones. Para hacer que este bloque funcione en ASP lo podemos hacer de las siguiente manera:

<% Dim xmlOrigen Dim xmlPlantilla Dim strXML Set xmlOrigen = Server.CreateObject(MSXML.DOMDocument) xmlOrigen.Async = False xmlOrigen.ValidateOnParse = False If xmlOrigen.Load(Serever.MapPath(Archivo.xml)) Then Set xmlPlantilla = Server.CreateObject(MSXML.DOMDocument) xmlPlantilla.Async = False xmlPlantilla.ValidateOnParse = False If xmlPlantilla.Load(Server.MapPath(Archivo.xsl)) then Response.Write _ xmlOrigen.TransformNode(xmlPlantilla)

GIXML.COM
Else No se pudo cargar End If Else No se pudo cargar Endif %>
ASP: Combinacin de dos archivos XML

Conclusin
Este sencillo cdigo puede servir de inicio para aplicaciones mas complejas que pueden ir desde boletines de noticias hasta generadores de cdigo de aplicaciones RAD. La parte interesante de este programa no es el programa en s, sino, la construccin del conjunto de datos XML y la plantilla que lo va a transformar. Cambiando la plantilla se pueden obtener infinitos cambios tiles desde el mismo conjunto de datos por lo cual una investigacin mas profunda del XSL en combinacin con la aplicacin que construimos sera mas que beneficioso.

Referencias
[1] Para informacin acerca del interpretador (parser) de XML www.microsoft.com/xml [2] Para informacin en general de XML visite la pgina www.xml101.com [3] Para informacin acerca de Visual Basic: www.vbpj.com.

Material reproducido para fines acadmicos, prohibida su reproduccin sin la autorizacin de los titulares de los derechos. 2001 Copyright GIXML. http://www.gixml.com

www.detodoprogramacion.com

Acerca del Autor


Juan Jos Riera Esteban es programador de aplicaciones administrativas con varios lenguajes de aplicacin desde 1990. Se ha especializado en Visual Basic y el API de Windows en la ultima temporada. Trabaja actualmente para la compaa Phoenix/Linx casa de software. Contctelo a travs del correo electrnico jujorie@hotmail.com .

Listado de la aplicacin Ejemplo


Para ejecutar la aplicacin siga los pasos que se mencionaron al inicio del articulo

'' '' '' ''

Cree un nuevo proyecto. Agrege las referencias del MSXML3.dll y copie este codigo en la forma Este codigo requiere 2 cuadros de texto, 3 cuadros de opciones 2 botones y 1 check box

Option Explicit ' Declaraciones del API de Windows '------------------------------------------------------------------'' Funcin del API que ejecuta un documento en Windows Private Declare Function ShellExecute Lib "shell32.dll" (ByVal hwnd As Long, _ ByVal lpOperation As String, _ ByVal lpFile As String, _ ByVal lpParameters As String, _ ByVal lpDirectory As String, _ ByVal nShowCmd As Long) As Long Const SW_SHOWNORMAL = 1 Alias "ShellExecuteA" _

GIXML.COM
'' Funcion del API que obtiene el directorio de archivos '' temporales de Windows Private Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" _ (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long '' Click en el boton cmdCerrar Private Sub cmdCerrar_Click() Unload Me End Sub '' Click en el Boton cmdAceptar Private Sub cmdAceptar_Click() Dim xmlOrigen As DOMDocument '' Documento origen Dim xmlPlantilla As DOMDocument '' Documento plantilla Dim strXML As String '' Resultado Dim strFilename As String '' Nombre del archivo Dim strTempPath As String '' Directorio temporal On Error GoTo Errores_cmdAceptar_Click '' Trampa de errores '' '' Verificar si es posible cargar el documento XML de origen '' si es posible cargar la plantilla y combinarlos en un nuevo '' documento

Material reproducido para fines acadmicos, prohibida su reproduccin sin la autorizacin de los titulares de los derechos. 2001 Copyright GIXML. http://www.gixml.com

www.detodoprogramacion.com

Set xmlOrigen = New DOMDocument '' Crear el objeto de '' origen (XML). xmlOrigen.async = False '' Cargar el documento '' de manera sncrona. xmlOrigen.validateOnParse = True '' Validar el documento '' completo. If xmlOrigen.Load(txtOrigen.Text) Then Set xmlPlantilla = New DOMDocument '' Crear el documento '' plantilla (XSL). xmlPlantilla.async = False xmlPlantilla.validateOnParse = False If xmlPlantilla.Load(txtPlantilla.Text) Then '' Aqui se genera el nuevo arbol de xml a partir de '' la mezcla del archivo Origen y la Plantilla. la '' funcion retorna un texto con el arbol xml resultado strXML = xmlOrigen.transformNode(xmlPlantilla) If optDestino(0).Value Then '' '' Guardar el nuevo documento en XML '' strFilename = InputBox("Archivo de XML", _ "Almacenar", "c:\salida.xml") If strFilename <> "" Then If Dir(strFilename) <> "" Then If MsgBox("Desea sobreescribir el archivo",_ vbYesNo + vbQuestion) = vbYes Then Kill strFilename Else Exit Sub End If End If Open strFilename For Binary As #1 Put #1, , strXML Close #1 End If ElseIf optDestino(1).Value Then '' '' Abrir el documento en el explorador de windows. '' (se requiere IExplorer 5.x, '' Netscape 6.x o cualquier '' navegador que soporte XML/XSL) '' strTempPath = Space(255) GetTempPath Len(strTempPath), strTempPath strTempPath = Left(Trim(strTempPath), _ Len(Trim(strTempPath)) - 1)

GIXML.COM

Material reproducido para fines acadmicos, prohibida su reproduccin sin la autorizacin de los titulares de los derechos. 2001 Copyright GIXML. http://www.gixml.com

www.detodoprogramacion.com

If chkExploreHTM.Value = vbChecked Then strFilename = Trim(strTempPath) & "temp.htm" Else strFilename = Trim(strTempPath) & "temp.xml" End If If Dir(strFilename) <> "" Then Kill strFilename Open strFilename For Binary As #1 Put #1, , strXML Close #1 ShellExecute hwnd, "open", strFilename, _ vbNullString, strTempPath, SW_SHOWNORMAL Else MsgBox strXML, vbInformation End If Else MsgBox "No se pudo cargar el archivo de plantilla" End If

GIXML.COM
Else MsgBox "No se pudo cargar el archivo origen" End If Exit Sub '' '' En este punto se validan los errores no controlados '' Errores_cmdAceptar_Click: MsgBox Err.Description, vbInformation, "Error No. " & Err End Sub
VB 5 o VB 6: Aplicacin ejemplo (Continuacin)

Material reproducido para fines acadmicos, prohibida su reproduccin sin la autorizacin de los titulares de los derechos. 2001 Copyright GIXML. http://www.gixml.com

www.detodoprogramacion.com

Anda mungkin juga menyukai