Forums Últimos mensajes - Powered by IBM
 
Tags Palabras claves

Leer XML

11/01/2006 - 23:58 por Daniel G. Samborski | Informe spam
Hola, luego de mucho buscar encontré dos codigos, segun dicen, los mas
rapidos para leer un XML grande (12800 registros aprox) y guardarlos en una
base de datos SQL.

Pero tengo un problema, en algunos XML me da un error en una fila
determinada y con otro XML anda perfecto.
Seria posible que trate de leer algun null, es que el XML lo creo a partir
de una tabla ya existente.
Esta tabla la debo pasar a otra maquina que esta muy lejos, la debo enviar
por correo.

Aqui les pongo un ejemplo del XML que tengo y de dos codigos para leerlos. Y
el error que cada uno da.

XML

<?xml version="1.0" standalone="yes"?>
<NewDataSet>
<Table>
<CodCli>66</CodCli>
<NroDoc>10068746</NroDoc>
<ApellNomb>FERREYRA JOAQUIN</ApellNomb>
<Calle>ANCHORENA 2122</Calle>
<NombLoc>Rosario</NombLoc>
</Table>
<Table>
<CodCli>67</CodCli>
<NroDoc>2819773</NroDoc>
<ApellNomb>ZZ GARCIA IRMA</ApellNomb>
<Calle>PUBLICA 2 6354 DB</Calle>
<NombLoc>Rosario</NombLoc>
</Table>
<Table>
<CodCli>68</CodCli>
<NroDoc>21821573</NroDoc>
<ApellNomb>ZZ LUGO CARLOS(GARANTE)</ApellNomb>
<Calle>ITALIA 6148</Calle>
<NombLoc>Rosario</NombLoc>
</Table>
</NewDataSet>


El primer codigo que probe...


Dim m_xmld As XmlDocument
Dim m_nodelist As XmlNodeList
Dim m_node As XmlNode

'Creamos el "XML Document"
m_xmld = New XmlDocument

'Cargamos el archivo
m_xmld.Load("C:\lista.xml")

'Obtenemos la lista de los nodos "name"
m_nodelist = m_xmld.SelectNodes("/NewDataSet/Table")

'Iniciamos el ciclo de lectura
For Each m_node In m_nodelist
'Obtenemos el atributo del codigo
' Dim mCodigo = m_node.Attributes.GetNamedItem("Table").Value

'Obtenemos el Elemento nombre
Dim CodCli = m_node.ChildNodes.Item(0).InnerText

'Obtenemos el Elemento apellido
Dim NroDoc = m_node.ChildNodes.Item(1).InnerText

Dim Apellido = m_node.ChildNodes.Item(2).InnerText

Dim Calle = m_node.ChildNodes.Item(3).InnerText

' Dim Nro = m_node.ChildNodes.Item(4).InnerText

Dim NombLoc = m_node.ChildNodes.Item(4).InnerText

Dim conexion As New Conexion
Dim parametros(4) As SqlParameter
parametros(0) = New SqlParameter("@codcli", SqlDbType.VarChar,
50)
parametros(0).Value = CodCli
parametros(1) = New SqlParameter("@nrodoc", SqlDbType.VarChar,
50)
parametros(1).Value = NroDoc
parametros(2) = New SqlParameter("@apellnomb",
SqlDbType.VarChar, 50)
parametros(2).Value = Apellido
parametros(3) = New SqlParameter("@calle", SqlDbType.VarChar,
50)
parametros(3).Value = Calle
'parametros(4) = New SqlParameter("@nro", SqlDbType.VarChar, 50)
'parametros(4).Value = Nro
parametros(4) = New SqlParameter("@nombloc", SqlDbType.VarChar,
50)
parametros(4).Value = NombLoc

conexion.ConectarSqlHelper("IngresaCliente", parametros)



'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

Erro que tira al ller el XML: Información adicional: Referencia a objeto
no establecida como instancia de un objeto.


Segundo ejemplo que probe

Dim m_xmlr As XmlTextReader
'Creamos el XML Reader
m_xmlr = New XmlTextReader("C:\lista.xml")

'Desabilitamos las lineas en blanco,
'ya no las necesitamos
m_xmlr.WhitespaceHandling = WhitespaceHandling.Significant

'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

'Read elements firstname and lastname

m_xmlr.Read()
'Obtenemos el elemento del Nombre del Usuario


'Obtenemos el elemento del Apellido del Usuario



Dim CodCli = m_xmlr.ReadElementString("CodCli")

'Obtenemos el Elemento apellido
Dim NroDoc = m_xmlr.ReadElementString("NroDoc")

Dim Apellido = m_xmlr.ReadElementString("ApellNomb")

Dim Calle = m_xmlr.ReadElementString("Calle")

' Dim Nro = m_node.ChildNodes.Item(4).InnerText

Dim NombLoc = m_xmlr.ReadElementString("NombLoc")

Dim conexion As New Conexion
Dim parametros(4) As SqlParameter
parametros(0) = New SqlParameter("@codcli", SqlDbType.VarChar,
50)
parametros(0).Value = CodCli
parametros(1) = New SqlParameter("@nrodoc", SqlDbType.VarChar,
50)
parametros(1).Value = NroDoc
parametros(2) = New SqlParameter("@apellnomb",
SqlDbType.VarChar, 50)
parametros(2).Value = Apellido
parametros(3) = New SqlParameter("@calle", SqlDbType.VarChar,
50)
parametros(3).Value = Calle
'parametros(4) = New SqlParameter("@nro", SqlDbType.VarChar, 50)
'parametros(4).Value = Nro
parametros(4) = New SqlParameter("@nombloc", SqlDbType.VarChar,
50)
parametros(4).Value = NombLoc

conexion.ConectarSqlHelper("IngresaCliente", parametros)



End While

'Cerramos la lactura del archivo
m_xmlr.Close()

Error que tira al leer el XML: Información adicional: Error del sistema.


Como dije, estos mismos codigos los probe con otra tabla, y funcionaron muy
bien.
Por que creen que podria ser el error, null, vacios...????


Otra consulta, ademas de estos dos codigos, alguno de ustedes conoce alguna
otra forma de leer un XML muy grande de mas de 12000 registros y que sea
rapido.


Daniel.
 

Leer las respuestas

#1 Hector Minaya [VB.Net MVP]
12/01/2006 - 04:10 | Informe spam
Deberias tratar utilizando el metodo .ReadXML del dataset, es muy bueno.


"Daniel G. Samborski" wrote in
message news:%
Hola, luego de mucho buscar encontré dos codigos, segun dicen, los mas
rapidos para leer un XML grande (12800 registros aprox) y guardarlos en
una base de datos SQL.

Pero tengo un problema, en algunos XML me da un error en una fila
determinada y con otro XML anda perfecto.
Seria posible que trate de leer algun null, es que el XML lo creo a partir
de una tabla ya existente.
Esta tabla la debo pasar a otra maquina que esta muy lejos, la debo enviar
por correo.

Aqui les pongo un ejemplo del XML que tengo y de dos codigos para leerlos.
Y el error que cada uno da.

XML

<?xml version="1.0" standalone="yes"?>
<NewDataSet>
<Table>
<CodCli>66</CodCli>
<NroDoc>10068746</NroDoc>
<ApellNomb>FERREYRA JOAQUIN</ApellNomb>
<Calle>ANCHORENA 2122</Calle>
<NombLoc>Rosario</NombLoc>
</Table>
<Table>
<CodCli>67</CodCli>
<NroDoc>2819773</NroDoc>
<ApellNomb>ZZ GARCIA IRMA</ApellNomb>
<Calle>PUBLICA 2 6354 DB</Calle>
<NombLoc>Rosario</NombLoc>
</Table>
<Table>
<CodCli>68</CodCli>
<NroDoc>21821573</NroDoc>
<ApellNomb>ZZ LUGO CARLOS(GARANTE)</ApellNomb>
<Calle>ITALIA 6148</Calle>
<NombLoc>Rosario</NombLoc>
</Table>
</NewDataSet>


El primer codigo que probe...


Dim m_xmld As XmlDocument
Dim m_nodelist As XmlNodeList
Dim m_node As XmlNode

'Creamos el "XML Document"
m_xmld = New XmlDocument

'Cargamos el archivo
m_xmld.Load("C:\lista.xml")

'Obtenemos la lista de los nodos "name"
m_nodelist = m_xmld.SelectNodes("/NewDataSet/Table")

'Iniciamos el ciclo de lectura
For Each m_node In m_nodelist
'Obtenemos el atributo del codigo
' Dim mCodigo = m_node.Attributes.GetNamedItem("Table").Value

'Obtenemos el Elemento nombre
Dim CodCli = m_node.ChildNodes.Item(0).InnerText

'Obtenemos el Elemento apellido
Dim NroDoc = m_node.ChildNodes.Item(1).InnerText

Dim Apellido = m_node.ChildNodes.Item(2).InnerText

Dim Calle = m_node.ChildNodes.Item(3).InnerText

' Dim Nro = m_node.ChildNodes.Item(4).InnerText

Dim NombLoc = m_node.ChildNodes.Item(4).InnerText

Dim conexion As New Conexion
Dim parametros(4) As SqlParameter
parametros(0) = New SqlParameter("@codcli", SqlDbType.VarChar,
50)
parametros(0).Value = CodCli
parametros(1) = New SqlParameter("@nrodoc", SqlDbType.VarChar,
50)
parametros(1).Value = NroDoc
parametros(2) = New SqlParameter("@apellnomb",
SqlDbType.VarChar, 50)
parametros(2).Value = Apellido
parametros(3) = New SqlParameter("@calle", SqlDbType.VarChar,
50)
parametros(3).Value = Calle
'parametros(4) = New SqlParameter("@nro", SqlDbType.VarChar,
50)
'parametros(4).Value = Nro
parametros(4) = New SqlParameter("@nombloc", SqlDbType.VarChar,
50)
parametros(4).Value = NombLoc

conexion.ConectarSqlHelper("IngresaCliente", parametros)



'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

Erro que tira al ller el XML: Información adicional: Referencia a objeto
no establecida como instancia de un objeto.


Segundo ejemplo que probe

Dim m_xmlr As XmlTextReader
'Creamos el XML Reader
m_xmlr = New XmlTextReader("C:\lista.xml")

'Desabilitamos las lineas en blanco,
'ya no las necesitamos
m_xmlr.WhitespaceHandling = WhitespaceHandling.Significant

'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

'Read elements firstname and lastname

m_xmlr.Read()
'Obtenemos el elemento del Nombre del Usuario


'Obtenemos el elemento del Apellido del Usuario



Dim CodCli = m_xmlr.ReadElementString("CodCli")

'Obtenemos el Elemento apellido
Dim NroDoc = m_xmlr.ReadElementString("NroDoc")

Dim Apellido = m_xmlr.ReadElementString("ApellNomb")

Dim Calle = m_xmlr.ReadElementString("Calle")

' Dim Nro = m_node.ChildNodes.Item(4).InnerText

Dim NombLoc = m_xmlr.ReadElementString("NombLoc")

Dim conexion As New Conexion
Dim parametros(4) As SqlParameter
parametros(0) = New SqlParameter("@codcli", SqlDbType.VarChar,
50)
parametros(0).Value = CodCli
parametros(1) = New SqlParameter("@nrodoc", SqlDbType.VarChar,
50)
parametros(1).Value = NroDoc
parametros(2) = New SqlParameter("@apellnomb",
SqlDbType.VarChar, 50)
parametros(2).Value = Apellido
parametros(3) = New SqlParameter("@calle", SqlDbType.VarChar,
50)
parametros(3).Value = Calle
'parametros(4) = New SqlParameter("@nro", SqlDbType.VarChar,
50)
'parametros(4).Value = Nro
parametros(4) = New SqlParameter("@nombloc", SqlDbType.VarChar,
50)
parametros(4).Value = NombLoc

conexion.ConectarSqlHelper("IngresaCliente", parametros)



End While

'Cerramos la lactura del archivo
m_xmlr.Close()

Error que tira al leer el XML: Información adicional: Error del sistema.


Como dije, estos mismos codigos los probe con otra tabla, y funcionaron
muy bien.
Por que creen que podria ser el error, null, vacios...????


Otra consulta, ademas de estos dos codigos, alguno de ustedes conoce
alguna otra forma de leer un XML muy grande de mas de 12000 registros y
que sea rapido.


Daniel.

Preguntas similares