XML y .NET¿Alguna vez ha tenido la necesidad de que su programa interactué con información de configuración u otro tipo de datos grabados por el mismo sistema? (como la configuración para cada usuario, preferencias, referencias a archivos, etc.), una forma de resolver esto es mediante archivos planos, otra forma es creando archivos planos tipo .ini (que contienen información con formato), a los cuales hay que darles un tratamiento adecuado para grabarlos y recuperarlos.
Una opción igual de valida es la utilización de archivos XML, aprovechando el soporte que nos das el .Net Framework. En él se encuentra una jerarquía de clases para el tratamiento de archivos XML como detallare mas adelante.
Pero, ¿qué es XML?, son documentos estructurados para el manejo de información, estos datos están contenidos en formatos que son autodefinidos por medio de “etiquetas”. Para mayor detalle al respecto puede consultar a wikipedia:
es.wikipedia.org/wiki/XML .
Un Ejemplo que llamaremos “probar.xml”: Queremos los datos contenga el nombre de un usuario y correo respectivos.
jose jose@jose.com pedro pedro@pedro.com pablo pablo@pablo.com s
Algo a tener en cuenta sobre los documentos XML es que estos deben estar bien formados y ser válidos. Un documento está bien formado si todas las Etiquetas de apertura cuentan con sus respectivas Etiquetas de cierre, cuenta con un solo elemento raíz en el cuál están incluidos todos los demás.
¿Como maneja Net los documentos XML? .Net Framework maneja los XML a través del namespace (jerarquía lógica de clases, agrupadas por temas en común) System.Xml, que contienen clases diseñadas para tareas de escritura, lectura, conversión entre otras.
A continuación muestro el ámbito relacionado con XML que conforman System.XML:
:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />
Para leer de manera secuencial un documento XML, esto es nodo a nodo y elemento a elemento, tenemos a nuestra disposición las clases derivadas de XmlReader:
XmlReader - XmlTextReader
- XmlValidatingReader
- xmlNodeReader
En la gráfica se muestra la interacción de las clases del namespace System.Xml con un documento XML:
A continuación construiremos un ejemplo de lectura en vb.Net, con salida en la consola (pantalla), de un archivo XML tomando como referencia el ejemplo anterior ( “probar.xml” ) :
Imports System.Xml ' Espacio de nombre que se va utilizar
Module Module1
Sub Main()
' Obtenemos el documento XML desde el archivo, que se encuentra en el sub directorio "Bin" del proyecto
Dim lector As New XmlTextReader("probar.xml")
While lector.Read() ' recorre todo el documento
Select Case lector.NodeType
Case XmlNodeType.Element ' Si es un elemento
Console.Write("", lector.Name)
Console.WriteLine() 'salto de linea
Case XmlNodeType.Text ' Si es un texto
Console.Write(lector.Value) 'Imprime el valor
Case XmlNodeType.EndElement ' Si es el final del elemento
Console.Write("", lector.Name)
Console.WriteLine() 'salto de linea
End Select
End While
Console.WriteLine() 'salto de linea
lector.Close() ' cerramos el lector
End Sub
'Nota: "", lector.Name => lo utilizamos para dar el formato de salida del tìpo: < nombre_de_la_etiqueta >
End Module
Como puede ver con las clases derivadas de
XmlReader es posible recuperar la información contenida en un documento Xml, pero en ningún caso facilita mecanismos para modificar el contenido de los nodos, eliminar, ó añadir elementos.
Para ello existe mecanismo como la clase
XmlDocument, esta clase permite al documento Xml estar en memoria (genera un árbol jerárquico, compuesto por los nodos y elementos) y ofrece facilidades de navegación, lectura, modificación.
XmlDocument cuenta con Propiedades y métodos importantes para nuestros fines:
- DocumentElemento => obtendremos el primer elemento, el que representa la raíz de todos los demás
- NodeType => Contiene el tipo de Nodo.
- Value=> El valor de Nodo
- ChildNodes=> Recupera la lista de nodos hijos del nodo actual
A continuación construiremos un ejemplo que permite modificar el Archivo “probar.xml” anteriormente creado y grabar las modificaciones en un documento llamado “nueva_prueba.xml” con salida en la consola (pantalla) para ello hago uso de XmlDocument:
Imports System.Xml
Module Module1
Sub Main()
Dim documento As New XmlDocument
Dim nodo As XmlNode
Dim mynombre, mycorreo As String
documento.Load("probar.xml") ' Documento XML desde el archivo, que se encuentra en el sub directorio "Bin" del proyecto
For Each nodo In documento.DocumentElement.ChildNodes ' Recorrer los nodos
If nodo.Name = "usuario" Then ' si el nodo se llama captura los nodos hijos de este
mynombre = nodo.ChildNodes(0).InnerText 'La recuperacion es ordenada, ChildNodes ( 0 ) , ChildNodes ( 1 )
mycorreo = nodo.ChildNodes(1).InnerText
End If
If mynombre = "pedro" Then ' Aqui se va modificar un dato, si es igual a "pedro" se va modificar por "Pedrito"
Console.Write("antes su nombre era => " & mynombre)
Console.WriteLine()
mynombre = "Pedrito"
nodo.ChildNodes(0).InnerText = mynombre ' Aqui se pasa el nuevo valor al nodo en cuestion
End If
Console.Write("nombre: " & mynombre & " correo: " & mycorreo)
Console.WriteLine()
Next
documento.Save("nueva_prueba.xml") 'Aqui se guarda las modificaciones en otro archivo
End Sub
End Module
............. Mas adelante mostrare como crear un documento Xml desde Net ........