En este artículo explicaremos como leer un archivo en XML en .Net, utilizando las clases XMLTextReader y XmlDocument, y las ventajas utilizar de cada una de ellas.
Como primer paso debemos tener un archivo XML que nos sirva para probar nuestra aplicación. Podemos crearlo con el código detallado abajo con el nombre de XMLPrueba.xml. Debemos crear este archivo en un editor como el NotePad, ya que necesitamos un archivo sin caracteres extraños.
<?xml version="1.0" encoding="UTF-8"?> <usuarios> <name codigo="mtorres"> <nombre>Maria </nombre> <apellido>Torres </apellido> </name> <name codigo="cortiz"> <nombre>Carlos </nombre> <apellido>Ortiz </apellido> </name> </usuarios>
Luego de tener nuestro archivo creado podremos continuar con nuestro código en VB.NET
Utilizando el XMLTextReader
Este formato es muy sencillo y para leer el achivo debemos hacerlo secuencialmente, línea por línea.
Imports System.IO Imports System.Xml Module ParsingUsingXmlTextReader Sub Main() Dim m_xmlr As XmlTextReader 'Creamos el TextReader m_xmlr = New XmlTextReader("C:\XMLPrueba.xml") 'Desabilitamos las lineas en blanco, 'ya no las necesitamos m_xmlr.WhiteSpaceHandling = WhiteSpaceHandling.NONE 'Leemos el archivo y avanzamos al tag de usuarios m_xmlr.Read() 'Leemos el tag usuarios m_xmlr.Read() 'Creamos la secuancia que nos permite 'leer el archivo While Not m_xmlr.EOF 'Avanzamos al siguiente tag m_xmlr.Read() 'si no tenemos el elemento inicial 'debemos salir del ciclo If Not m_xmlr.IsStartElement() Then Exit While End If 'Obtenemos el elemento codigo Dim mCodigo = m_xmlr.GetAttribute("codigo") 'Read elements firstname and lastname m_xmlr.Read() 'Obtenemos el elemento del Nombre del Usuario Dim mNombre = m_xmlr.ReadElementString("nombre") 'Obtenemos el elemento del Apellido del Usuario Dim mApellido = m_xmlr.ReadElementString("apellido") 'Escribimos el resultado en la consola, 'pero tambien podriamos utilizarlos en 'donde deseemos Console.WriteLine("Codigo usuario: " & mCodigo _ & " Nombre: " & mNombre _ & " Apellido: " & mApellido) Console.Write(vbCrLf) End While 'Cerramos la lactura del archivo m_xmlr.Close() End Sub End Module
Utilizando el XmlDocument
Este formato es mas complejo y nos permite recorrer los nodos sin tener que utilizar una lectura secuencial. Definitivamente este formato es más eficiente que el anterior principalmente para documentos muy grandes.
Imports System.IO Imports System.Xml Module ParsingUsingXmlDocument Sub Main() Try Dim m_xmld As XmlDocument Dim m_nodelist As XmlNodeList Dim m_node As XmlNode 'Creamos el "Document" m_xmld = New XmlDocument() 'Cargamos el archivo m_xmld.Load("C:\XMLPrueba.xml") 'Obtenemos la lista de los nodos "name" m_nodelist = m_xmld.SelectNodes("/usuarios/name") 'Iniciamos el ciclo de lectura For Each m_node In m_nodelist 'Obtenemos el atributo del codigo Dim mCodigo = m_node.Attributes.GetNamedItem("codigo").Value 'Obtenemos el Elemento nombre Dim mNombre = m_node.ChildNodes.Item(0).InnerText 'Obtenemos el Elemento apellido Dim mApellido = m_node.ChildNodes.Item(1).InnerText 'Escribimos el resultado en la consola, 'pero tambien podriamos utilizarlos en 'donde deseemos Console.Write("Codigo usuario: " & mCodigo _ & " Nombre: " & mNombre _ & " Apellido: " & mApellido) Console.Write(vbCrLf) Next Catch ex As Exception 'Error trapping Console.Write(ex.ToString()) End Try End Sub End Module
Artículo relacionado :
Crea tu propio lector de RSS en tu página web
También podrías usar deserialize creando un objeto basado en la estructura del XML y así tener más facilidad de lectura
Hola Roy,
Está muy interesante este artículo, yo he buscado información similar, pero para poder aplicar algunos métodos similares(como los utilizados en los archivos xml) a datos leidos desde un campo sql server, como el que muestro a continuación; no contiene la estructura completa de un archivo xml, comenzando porque no tiene el prólogo, pero en lo básico es bastante similar. La verdad no he encontrado algo para poder manipularl estos campos al igual o similar a un archivo xml, agradeceré mucho cualquier ayuda al respecto.
Muchas gracias.
P01
FT
0
0
PT00001
SL01
04
25
2.3000
4.5455
10.4547
eladio
2016-04-16T12:32:07.140
P01
FT
0
0
PT00001
SL01
04
24
18.0000
4.5455
81.8190
eladio
2016-04-16T12:32:07.137
Estoy intentando ver datos en Datagrid o ListVew en Visual Net
de este tipo de xml, tengo muchos codigos de fuente, pero ninguno me resuelbe este problema !!
Desde ya agradezco un aporte
PD: Puedo leer otros tipo de xml, este no !!!
Saludos
==============================
–
–
–
Cuando cargas el xml en un dataset o en un xmldocument que error te da?
me marca este error:
System.NullReferenceException: Referencia a objeto no establecida como instancia de un objeto.
en PuntodeVenta.FrmEntraSalidas.lee_xml2() en C:\Users\Luis\Documents\Visual Studio 2010\Projects\PuntodeVenta\PuntodeVenta\Vales\FrmEntraSalidas.vb:línea 438
Buenas tardes don Roy excelente aportes, tengo problemas para leer la factura electrónica (XML) que me envía el cliente para su aprobación.
Ejecute el código que muy amablemente publico y me funciona super bien, no obstante al intentar ejectutarlo con un caso real, no se como leer los nodos respectivos.
50606021800010898043200100001010000000070190000009
00100001010000000070
2018-02-06T17:04:18-06:00
Agradezco la ayuda al respecto,
Y gracias por su valiosos y profesionales aporte.
Para leer los nodos Clave o Consecutivo
[VB]
Dim consecutivo As String = xmlEnvia.GetElementsByTagName(“NumeroConsecutivo”)(0).InnerText
Dim clave As String = xmlEnvia.GetElementsByTagName(“Clave”)(0).InnerText
[C#]
string consecutivo = xmlEnvia.GetElementsByTagName(“NumeroConsecutivo”)(0).InnerText;
string clave = xmlEnvia.GetElementsByTagName(“Clave”)(0).InnerText;
No se si esto es a lo que referías