Vous êtes sur la page 1sur 12

Sistemas UNI. Instructor: V. Carlos, Segura P.

LABORATORIO XML y Web Services en .NET – 3.

Derechos Reservados, solo para ser usados dentro de


la institución.
Derechos de Autor

El contenido de este laboratorio tiene todos los derechos reservados, por lo tanto no
se puede reproducir, transcribir, almacenar a un sistema de recuperación o de
alteración, asimismo la traducción a otro idioma de ninguna forma o por ningún
medio mecánico, manual, electrónico, magnético, óptico o de otro modo.

La persecución de una reproducción no autorizada tiene como


consecuencia la cárcel y/o multas.

UNIVERSIDAD NACIONAL DE INGENIERIA 1


FACULTAD DE INGENIERIA INDUSTRIAL Y DE SISTEMAS
Sistemas UNI. Instructor: V. Carlos, Segura P.

3 XML y Web Services.NET

1 Manejo, Validación de XML


1.1 XSL: eXtensible StyleSheet Language

Un documento XML valido tiene datos que cumplen con una serie de reglas definidas por un usuario que describen los
valores, elementos y orden correctos:

Las reglas pueden expresarse mediante un DTD o XML Esquema


Por ejemplo, si el esquema especifica que los elementos dentro de la raíz tienen que ir en un orden en
particular y el documento no cumple con ese orden, no se considera válido.

Un documento válido siempre estará bien-formado, pero no necesariamente al revés.

Principales Espacios para dar Suporte para uso de XML en .NET

System.Xml: Espacio de nombre principal para soporte a XML


System.Xml.Schema: Ofrece soporte para Esquemas de W3C y de Miscrosft
System.Xml.Serialization: Ofrece soporte para serialización y de-serialización de
objetos de y hacia XML.
System.Xml.XPath: Soporta parseo y evaluación.
System.Xml.Xsl: Soporta transformaciones vía estilos y hojas de estilos XML

Clases principales de uso de System.XML

XmlTextReader: Lee documentos de XML y revisa que estén bien-formados, pero no


los valida
XmlValidatingReader: Permite validación de documentos contra un DTD o XML
Esquema
XmlTextWriter: Un escritor rápido y que provee métodos solo-hacia-adelante para
escribir archivos XML
XmlDocument: Implementa una representación en-memoria de un documento XML,
de acuerdo al DOM del W3C.

UNIVERSIDAD NACIONAL DE INGENIERIA 2


FACULTAD DE INGENIERIA INDUSTRIAL Y DE SISTEMAS
Sistemas UNI. Instructor: V. Carlos, Segura P.

Permite que datos XML


puedan ser escritos a un
archivo XML.

XmlTextWriter XML XmlDocument

Representa un modelo
Provee un mecanismo de de objetos en memoria
lectura forward-only de de toda la estructura de
un documento XML XmlReader un documento XML

XmlTextReader XmlValidatingReader XmlNodeReader

Lee datos de un Para realizar Permite leer


documento XML validaciones DOM datos de un
o un Stream nodo XML

1.2 Clases de Validación para XML: XmlSchemaSet

Es una clase que mantiene dentro de una cache el almacenamiento para la validación de esquemas de archivos XML.
Esta clase se introdujo para solucionar las deficiencias que tenían las clases de validación anteriores como
XmlValidatingReader y XmlSchemaCollection, como la validación con respecto a compatibilidad con estándares en
XML

Microsoft define las principales diferencias como se indica a continuación:

XmlSchemaCollection XmlSchemaSet

Es compatible con los esquemas XML del Sólo es compatible con los esquemas XML del W3C.
W3C y del XDR de Microsoft.

Los esquemas se compilan cuando se Los esquemas no se compilan cuando se llama al


llama al método Add. método Add. Esto proporciona una mejora del
rendimiento durante la creación de la biblioteca de
esquemas.

Cada esquema genera una versión Los esquemas compilados generan un esquema único
compilada individual que puede producir lógico, es decir, un "conjunto" de esquemas. Cualquier
"islas de esquemas". Como resultado, esquema importado a un esquema que se haya
todas las inclusiones e importaciones sólo agregado al conjunto, también se agrega directamente
tienen el ámbito de ese esquema. al conjunto. Esto significa que todos los tipos están
disponibles para todos los esquemas.

Sólo puede haber en la colección un Se pueden agregar varios esquemas para el mismo
esquema para un espacio de nombres de espacio de nombres de destino siempre y cuando no
destino concreto. haya conflictos de tipo.

UNIVERSIDAD NACIONAL DE INGENIERIA 3


FACULTAD DE INGENIERIA INDUSTRIAL Y DE SISTEMAS
Sistemas UNI. Instructor: V. Carlos, Segura P.

Ejemplo para la validación de Archivos XML.


1.- Crear el siguiente formulario con el siguiente diseño:

2.- Crearemos 2 variables de ámbito local para ser usado en el formulario:

Dim xFileXML As String


Dim xFileXSD As String

3.- Dentro del botón “Genera Archivos”, se realizara la creación de dos archivos un XML y el Esquema XSD
del XML, que contendrá información de la tabla Employees.

Try
xCon = New SqlConnection(strCon)
xCon.Open()
Dim ds As New DataSet("Empleados")
Dim sql As String = "SELECT EmployeeID, LastName, FirstName, " + _
"Address, City, Country, HomePhone " + _
"From Employees "
Dim Ad As New SqlDataAdapter(sql, xCon)
Ad.Fill(ds, "Empleado")
ds.WriteXml("Empleados.xml")
ds.WriteXmlSchema("Empleados.xsd")
xCon.Close()
Catch ex As Exception
MsgBox("Error:" + ex.Message)
End Try

4.- En el botón “Seleccionar XML” servirá para seleccionar el archivo XML generado anteriormente, el cual
también se mostrar en la caja de texto:

Dim openfile As New OpenFileDialog


openfile.Filter = "Archivo XML|*.xml"
If openfile.ShowDialog = Windows.Forms.DialogResult.OK Then
xFileXML = openfile.FileName
Me.txtXML.Text = File.OpenText(xFileXML).ReadToEnd
End If
openfile = Nothing

5.- Lo mismo pero para seleccionar el esquema del archivo generado:

Dim openfile As New OpenFileDialog


openfile.Filter = "Archivo XML|*.xsd"
If openfile.ShowDialog = Windows.Forms.DialogResult.OK Then
xFileXSD = openfile.FileName
Me.txtXSD.Text = File.OpenText(xFileXSD).ReadToEnd

UNIVERSIDAD NACIONAL DE INGENIERIA 4


FACULTAD DE INGENIERIA INDUSTRIAL Y DE SISTEMAS
Sistemas UNI. Instructor: V. Carlos, Segura P.

End If
openfile = Nothing

6.- Para la validación del archivo XML que corresponda con el esquema será el siguiente:

Try
Dim xSchema As New XmlSchemaSet
xSchema.Add(String.Empty, XmlReader.Create(xFileXSD))

Dim rSettings As New XmlReaderSettings


rSettings.Schemas = xSchema
rSettings.ValidationType = ValidationType.Schema

Dim reader As XmlReader = XmlReader.Create(xFileXML, rSettings)

While (reader.Read())
End While

MsgBox("El Archivo XML es Valido")


Catch ex As XmlSchemaException
MsgBox("Archivo no es valido: " + Environment.NewLine + _
ex.Message)
End Try

1.3 Uso de la Clase XmlTextReader

La clase XmlTextReader se convierte en un lector de archivos XML de acceso rápido, pero solo con
desplazamiento hacia delante y de solo lectura, esto es debido a que no proporciona almacenamiento en
la caché del archivo levantado por esta clase.

Para ser uso de la clase XmlTextReader el documento XML se debe tener en cuenta los siguientes
requerimientos:

El Documento XML debe ser un documento bien definido.


Con la clase XmlTextReader no se podrá realizar validación de datos.
La clase XmlTextReader comprueba si DTD tiene el formato correcto, pero no realiza
la validación con DTD asociado.

Principales métodos y propiedades de un XmlTextReader:

Read
Realiza la lectura del siguiente Nodo.

ReadElementString
Devuelve el valor del nodo indicado.

GetAttribute
Devuelve el valor del atributo indicado.

WhitespaceHandling
Los espacios en blanco no son tomados en cuenta por la clase.

ReadEndElement
Verifica si el nodo es un a etiqueta de cierre y desplaza al siguiente nodo.

IsStartElement
Comprueba si el nodo de contenido actual es una etiqueta de apertura.

LocalName
Obtiene el nombre actual del nodo.

UNIVERSIDAD NACIONAL DE INGENIERIA 5


FACULTAD DE INGENIERIA INDUSTRIAL Y DE SISTEMAS
Sistemas UNI. Instructor: V. Carlos, Segura P.

Ejemplo del uso de la clase XmlTextReader.

1.- Crear el siguiente formulario:

2.- Dentro del botón “Leer XML”, escribiremos la selección del Arxhivo XML para obtener la ruta del
archivo y asi ejecutar el proceso MostrarAgencias.

Dim openfile As New OpenFileDialog


openfile.Filter = "Archivo XML|*.xml"
If openfile.ShowDialog = Windows.Forms.DialogResult.OK Then
MostrarAgencias(openfile.FileName)
End If
openfile = Nothing

3.- Para realizar el proceso MostrarAgencias necesitamos crear el siguiente XML con la siguente
estructura:

<?xml version="1.0" encoding="utf-8" ?>


<Agencias>
<Agencia>
<codigo>01</codigo>
<nombre>Agencia Comas</nombre>
<direccion>Av. Tupac Amaru 7878</direccion>
<telefono anexo="124">541-4879</telefono>
</Agencia>
<Agencia>
<codigo>02</codigo>
<nombre>Agencia Los Olivos</nombre>
<direccion>Av. Naranjal 4588</direccion>
<telefono anexo="123">532-7898</telefono>
</Agencia>
</Agencias>

4.- Escribir el siguiente metodo de lectura del XML.

Sub MostrarAgencias(ByVal xfile As String)


Dim rd As New XmlTextReader(xfile)

rd.WhitespaceHandling = WhitespaceHandling.None

rd.Read() 'Línea 1: <?xml version=...


rd.Read() 'Línea 2: <Agencias>
rd.Read() 'Línea 3: <Agencia>
Dim xAgencia As String

While rd.Read 'Línea 4: <codigo>

If Not rd.IsStartElement Then


Exit While
End If
Dim xCodigo As String = rd.ReadElementString("codigo")
Dim xNombre As String = rd.ReadElementString("nombre")
Dim xDir As String = rd.ReadElementString("direccion")

UNIVERSIDAD NACIONAL DE INGENIERIA 6


FACULTAD DE INGENIERIA INDUSTRIAL Y DE SISTEMAS
Sistemas UNI. Instructor: V. Carlos, Segura P.

Dim xAnexo As String = rd.GetAttribute("anexo")


Dim xTelf As String = rd.ReadElementString("telefono")

xAgencia &= xCodigo & " - " & _


xNombre & ", " & Space(2) & _
xDir & Space(2) & _
"Telf: " & xTelf & " -- " & xAnexo & vbCrLf

rd.Read() 'Línea 8: </Agencia>


End While

Me.txtDatos.Text = xagencia
End Sub

5.- El siguiente código daría el resultado siguiente:

1.4 Utilizando el XmlDocument

La clase XmlDocument fue implementada bajo las normas de “Core Document Object Model (DOM)
Level 1” y el “Core DOM Level 2” del consorcio W3C.

Y con esto se logra que la clase XmlDocument lea un archivo XML en forma de árbol en memoria para
realizar tanto métodos de recorrido o exploración como de edición de documentos XML.

Esta clase es mas compleja pero nos permite recorrer los nodos sin tener que utilizar una lectura
secuencial, así se convierte en mas eficiente que la clase anterior y debe de ser usada para documentos
XML muy grandes

Principales métodos y propiedades de un XmlDocument:

AppendChild:
Agrega un nodo especificado, dentro del documento XML, para esto se debe utilizar la clase
XmlElement el cual representa un nodo.

CreateAttribute
Devuelve un objeto XmlAttribute con el cual se usa el método SetAttribute para agregar
atributos con su valor en el nodo especificado.

CreateElement:
Devuelve un objeto XmlElement, para ser añadido a un documento XML mediante el método
AppenChild.

ImportNode:
Importa un nodo de otro documento al documento actual.

InsertAfter:
Inserta el nodo especificado después del nodo indicado.

InsertBefore:

UNIVERSIDAD NACIONAL DE INGENIERIA 7


FACULTAD DE INGENIERIA INDUSTRIAL Y DE SISTEMAS
Sistemas UNI. Instructor: V. Carlos, Segura P.

Inserta el nodo especificado antes del nodo indicado.


PrependChild():
Agrega el nodo especificado al principio de la lista de nodos secundarios del nodo indicado.
RemoveChild:
Remueve o elimina el nodo secundario especificado

ReplaceChild:
Reemplaza un nodo secundario por el nodo indicado.

Veamos un ejemplo de mantenimiento de un XML.

1.- Para esto crearemos un XML con la siguiente estructura.

<?xml version="1.0" encoding="utf-8"?>


<Gerencia>
<Sistemas>
<Desarrollo>
<Analista>Rolando Torres</Analista>
</Desarrollo>
<BaseDatos>
<Admin>Daniel Sanchez</Admin>
<Mant>Cristian Rojas</Mant>
</BaseDatos>
<Produccion>
<Operadores>Ped°o Almenar^yz</Operadores>
</Produccion>
</Sistemas>
<Administracion>
<Operador>Pedro Almenariz</Operador>
</Administracion>
</Gerencia>

El ejemplo que se realizara primero, se agregara un nuevo nodo cuyo nombre del nodo será Desarrollador
y con un valor igual al nombre Cesar Salazar, incluso con un atributo con el nombre de Tipo = “Junior”
(<Desarrollador Tipo="Junior">Cesar Salazar</ Desarrollador >), esto será dentro del nodo
<Desarrollo>.

Luego se reemplazara el nodo <Operadores>Ped°o Almenar^yz</Operadores> por el nodo dentro de


Administracion: <Operador>Pedro Almenariz</Operador>.

Finalmente se eliminara el nodo <Administracion>.

2.- El formulario que realizara la operación debe tener el siguiente diseño:

UNIVERSIDAD NACIONAL DE INGENIERIA 8


FACULTAD DE INGENIERIA INDUSTRIAL Y DE SISTEMAS
Sistemas UNI. Instructor: V. Carlos, Segura P.

3.- Dentro del botón “Seleccionar XML”, escribiremos lo siguiente:

Dim openfile As New OpenFileDialog


openfile.Filter = "Archivo XML|*.xml"
If openfile.ShowDialog = Windows.Forms.DialogResult.OK Then
MantXML(openfile.FileName)
End If
openfile = Nothing

4.- Escribir el método siguiente MantXML

Sub MantXML(ByVal xfile As String)


Dim xDoc As New XmlDocument

'Abrimos el archivo XML


xDoc.Load(xfile)
Me.txtAntes.Text = ""
Me.txtAntes.Text = xDoc.InnerXml

'Agregamos un nuevo Nodo con Atributos


Dim xNodoElem As XmlElement
xNodoElem = xDoc.SelectSingleNode("/Gerencia/Sistemas/Desarrollo")
Dim xNodoNew As XmlElement
xNodoNew = xDoc.CreateElement("Desarrollador")

xNodoNew.SetAttribute("Tipo", "Junior")
xNodoNew.InnerText = "Cesar Salazar"

xNodoElem.AppendChild(xNodoNew)

'Reemplazamos el Nodo: <Operadores>Ped°o Almenar^yz</Operadores>


'Por el Nodo: <Operador>Pedro Almenariz</Operador>
Dim xNodoR As XmlNode
xNodoR = xDoc.SelectSingleNode("/Gerencia/Administracion/Operador")
Dim xNodoAR As XmlNode
xNodoAR = xDoc.SelectSingleNode("/Gerencia/Sistemas/Produccion/Operadores")
'Realizamos el reemplazo del nodo
xNodoAR.ParentNode.ReplaceChild(xNodoR, xNodoAR)

'Realizamos la eliminación de un Nodo


Dim xNodoEl As XmlNode = xDoc.SelectSingleNode("/Gerencia/Administracion")
xNodoEl.ParentNode.RemoveChild(xNodoEl)

xDoc.Save(xfile)

Me.txtAhora.Text = ""
Me.txtAhora.Text = xDoc.InnerXml

End Sub

5.- El resultado será el Siguiente:

UNIVERSIDAD NACIONAL DE INGENIERIA 9


FACULTAD DE INGENIERIA INDUSTRIAL Y DE SISTEMAS
Sistemas UNI. Instructor: V. Carlos, Segura P.

Clase XmlNodeList

La clase XmlNodeList Representa una colección de nodos ordenados, del cual se obtiene desde un
XmlDocument. Esta clase admite admite la iteración y el acceso por índice, para esto usa la clase
XmlNode.

Item:
Obtiene el valor del nodo del índice indicado.

GetEnumerator:
Para ser usado en una iteración de tipo For Each simple para el cual usa la entrega del nodo a
través de la clase XmlNodeList.

For Each XmlNode In XmlNodeList


. .
. . .
Next

Clase XmlNode

La clase XmlNode es una clase abstracta la cual significa que no so trabajara directamente con ella, sino
que vamos a hacer uso de esta cuando se ha instanciada por la clase XmlDocument

ReplaceChild:
Reemplaza un nodo secundario por un nodo indicado.

ChildNodes.Item(nNodo).InnerText
Nos ayuda para determinar el valor del nodo seleccionado, nNodo indica la posición del nodo.
ChildNodes.Item(nNodo).Attributes.ItemOf(nAtributo).Value
Nos ayuda para determinar el valor del atributo seleccionado, nAtributo indica la posición del
atributo y la variable nNodo indica el nodo del cual va hacer leído el atributo.

UNIVERSIDAD NACIONAL DE INGENIERIA 10


FACULTAD DE INGENIERIA INDUSTRIAL Y DE SISTEMAS
Sistemas UNI. Instructor: V. Carlos, Segura P.

Ejemplo del uso de la clase XmlDocument.


1.- Crear el siguiente formulario:

2.- Dentro del botón “Leer XML”, se seleccionara el archivo XML, que luego hace el llamado del proceso
MostrarVendedores.

Dim openfile As New OpenFileDialog


openfile.Filter = "Archivo XML|*.xml"
If openfile.ShowDialog = Windows.Forms.DialogResult.OK Then
MostrarVendedores(openfile.FileName)
End If
openfile = Nothing

3.- Crearemos el siguiente archivo XML, donde uno de ellos contiene 2 atributos para poder leer su
contenido:

<Vendedores>
<Vendedor>
<codigo>VR44</codigo>
<nombres>Velarde Santa, Juan Tineo</nombres>
<agencia tipo="Tienda" estado="Activo">Agencia Ate</agencia>
</Vendedor>
<Vendedor>
<codigo>VFR2</codigo>
<nombres>Figueroa Quispe, Richard</nombres>
<agencia tipo="Almacen" estado="Activo">Agencia Lima</agencia>
</Vendedor>
<Vendedor>
<codigo>VG32</codigo>
<nombres>Castañeda Herrera, Jose Ivan</nombres>
<agencia tipo="Tienda" estado="Inactivo">Agencia Los Olivos</agencia>
</Vendedor>
</Vendedores>

4.- Para leer el XML con la clase XmlDocument, debemos realizar lo siguiente:

Sub MostrarVendedores(ByVal xfile As String)


Dim xDoc As New XmlDocument
Dim xNodoList As XmlNodeList
Dim xNodo As XmlNode
Dim xVendedores As String
'Abrimos el archivo XML
xDoc.Load(xfile)

'Obtenemos la lista de nodos


xNodoList = xDoc.SelectNodes("/Vendedores/Vendedor")

'Iniciamos el ciclo de lectura


For Each xNodo In xNodoList

Dim xCodigo As String = xNodo.ChildNodes.Item(0).InnerText


Dim xNombre As String = xNodo.ChildNodes.Item(1).InnerText
Dim xAgencia As String = xNodo.ChildNodes.Item(2).InnerText
'Obtenemos el primer atributo del segundo nodo
Dim xTipo As String = xNodo.ChildNodes.Item(2).Attributes.ItemOf(0).Value

UNIVERSIDAD NACIONAL DE INGENIERIA 11


FACULTAD DE INGENIERIA INDUSTRIAL Y DE SISTEMAS
Sistemas UNI. Instructor: V. Carlos, Segura P.

'Obtenemos el segundo atributo del segundo nodo


Dim xEst As String = xNodo.ChildNodes.Item(2).Attributes.ItemOf(1).Value

xVendedores &= xCodigo & " - " & _


xNombre & ", " & Space(2) & _
xAgencia & Space(2) & _
" (Tipo: " & xTipo & ", Estado: " & xEst & ")" & _
vbCrLf
Next

Me.txtDatos.Text = xVendedores
End Sub

5.- El resultado será el siguiente:

UNIVERSIDAD NACIONAL DE INGENIERIA 12


FACULTAD DE INGENIERIA INDUSTRIAL Y DE SISTEMAS

Vous aimerez peut-être aussi