Foros del Web » Programación para mayores de 30 ;) » .NET »

XML en variable tipo string

Estas en el tema de XML en variable tipo string en el foro de .NET en Foros del Web. Hola a todos, tengo un "pequeño" contratiempo con lo siguiente: Tengo el contenido de un fichero XML cargado en una variable de tipo string (este ...
  #1 (permalink)  
Antiguo 30/03/2005, 00:18
 
Fecha de Ingreso: febrero-2005
Mensajes: 18
Antigüedad: 19 años, 2 meses
Puntos: 0
Pregunta XML en variable tipo string

Hola a todos, tengo un "pequeño" contratiempo con lo siguiente:

Tengo el contenido de un fichero XML cargado en una variable de tipo string (este fichero me lo devuelve un procedimiento en una variable de tipo string). Lo que quisiera saber es si puedo tratar/cargar directamente esta variable para crearme un DataTable con ella o si inevitablemete tengo que guardar el contenido en un fichero y posteriormente cargarlo con un ReadXML.

Espero que alguien me pueda echar una mano y mil gracias de antemano.

Un saludo.
  #2 (permalink)  
Antiguo 30/03/2005, 05:32
 
Fecha de Ingreso: febrero-2005
Mensajes: 18
Antigüedad: 19 años, 2 meses
Puntos: 0
Hola de nuevo, he conseguido una posible solución (aunque no me gusta demasiado):

Código:
'Parametros de entrada:
'     StrXML: Cadena con el contenido XML
'     Usuario: Usuario que realiza la peticion (para poder guardar varias peticiones

Public Function StrXml2Table(ByVal StrXML As String, ByVal Usuario As String) As DataTable
        
        Dim ds As New DataSet("kk")
        Dim TablaDatos As DataTable
        Dim xd As XmlDocument

        xd = New XmlDocument
        xd.LoadXml(StrXML)

        xd.Save(RUTA_XML_LOCAL + Usuario + ".xml")

        ds.ReadXml(RUTA_XML_LOCAL + Usuario + ".xml")
        TablaDatos = New DataTable

        TablaDatos = ds.Tables(0)

        ds.Dispose()

        StrXml2Table = TablaDatos
End Sub
El problema que le veo es el tener que guardar el fichero XML en disco para seguidamente recuperarlo, con la consiguiente demora de acceso a disco tanto para escribirlo como para leerlo.

Seguro que tiene que haber algun metodo para evitar el tener que guardar el fichero para despues recuperarlo??????

Espero que a algun forero se le ocurra una mejor solucion.

Un saludo y mil gracias.
  #3 (permalink)  
Antiguo 30/03/2005, 13:59
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 4 meses
Puntos: 7
Podrías utilizar un MemoryStream para que las cosas sean un poco más rápidas:
Código:
Public Function StrXml2Table(ByVal StrXML As String, ByVal Usuario As String) As DataTable
        Dim ms As MemoryStream
        Dim sw As StreamWriter
        Try
            Dim ds As New DataSet
            ms = New MemoryStream(StrXML.Length)
            sw = New StreamWriter(ms)

            sw.Write(StrXML)
            ds.ReadXml(ms)

            ms.Close()

            Return ds.Tables(0)
        Catch ex As Exception
            Throw New Exception("Error en StrXml2Table: " & ex.ToString)
        Finally
            If Not sw Is Nothing Then : sw.Close() : End If
            If Not ms Is Nothing Then : ms.Close() : End If
        End Try
End Function
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #4 (permalink)  
Antiguo 31/03/2005, 01:04
 
Fecha de Ingreso: febrero-2005
Mensajes: 18
Antigüedad: 19 años, 2 meses
Puntos: 0
Antes que nada muchas gracias xKnown por tu interes y tiempo.

He probado tu propuesta y me sale el siguiente error :

Código:
Error en StrXml2Table: System.Xml.XmlException: Falta el elemento raíz. at System.Xml.XmlTextReader.Read() at System.Xml.XmlReader.MoveToContent() at System.Data.DataSet.ReadXml(XmlReader reader, Boolean denyResolving) at System.Data.DataSet.ReadXml(Stream stream) at ib.mBD.StrXml2Table(String StrXML) in D:\Fuentes\FuenteNet\ASP\ib\mBD.vb:line 175 
Descripción: Excepción no controlada al ejecutar la solicitud Web actual. Revise el seguimiento de la pila para obtener más información acerca del error y dónde se originó en el código. 

Detalles de la excepción: System.Exception: Error en StrXml2Table: System.Xml.XmlException: Falta el elemento raíz. at System.Xml.XmlTextReader.Read() at System.Xml.XmlReader.MoveToContent() at System.Data.DataSet.ReadXml(XmlReader reader, Boolean denyResolving) at System.Data.DataSet.ReadXml(Stream stream) at ib.mBD.StrXml2Table(String StrXML) in D:\Fuentes\FuenteNet\ASP\ib\mBD.vb:line 175

Error de código fuente: 


Línea 181:        Catch ex As Exception
Línea 182:
Línea 183:            Throw New Exception("Error en StrXml2Table: " & ex.ToString)
Línea 184:
Línea 185:        Finally
 

Archivo de origen: D:\Fuentes\FuenteNet\ASP\ib\mBD.vb    Línea: 183 

Seguimiento de la pila: 


[Exception: Error en StrXml2Table: System.Xml.XmlException: Falta el elemento raíz.
   at System.Xml.XmlTextReader.Read()
   at System.Xml.XmlReader.MoveToContent()
   at System.Data.DataSet.ReadXml(XmlReader reader, Boolean denyResolving)
   at System.Data.DataSet.ReadXml(Stream stream)
   at ib.mBD.StrXml2Table(String StrXML) in D:\Fuentes\FuenteNet\ASP\ib\mBD.vb:line 175]
   ib.mBD.StrXml2Table(String StrXML) in D:\Fuentes\FuenteNet\ASP\ib\mBD.vb:183
   ib.mBD.AbrirFicheroUV(String Frase) in D:\Fuentes\FuenteNet\ASP\ib\mBD.vb:52
   ib.WebForm1.Page_Load(Object sender, EventArgs e) in D:\Fuentes\FuenteNet\ASP\ib\WebForm1.aspx.vb:30
   System.Web.UI.Control.OnLoad(EventArgs e)
   System.Web.UI.Control.LoadRecursive()
   System.Web.UI.Page.ProcessRequestMain()
Este error lo que me da a entender es que la estructura XML no es válida, pero si no es valida como que en la version de la funcion que expuse primero (la que guardaba en disco el XML y luego lo leia) funciona correctamente.

Ademas no entiendo muy bien el porque declaras e inicializas la variable sw si despues no se utiliza para nada.

Muchas gracias de nuevo y un saludo a todos.
  #5 (permalink)  
Antiguo 31/03/2005, 02:32
 
Fecha de Ingreso: febrero-2005
Mensajes: 18
Antigüedad: 19 años, 2 meses
Puntos: 0
xKnown he "descubierto" algunas cosas, primero modifique tu modificacion (valga la redundancia) del siguiente modo:

Código:
Public Function StrXml2Table(ByVal StrXML As String) As DataTable

        Dim ms As MemoryStream
        Dim sw As StreamWriter
        Dim kk() As Byte  'Añadido

        Try
            Dim ds As New DataSet
            ms = New MemoryStream(StrXML.Length)
            sw = New StreamWriter(ms)

            sw.Write(StrXML)
            kk = ms.GetBuffer  'Añadido

            ds.ReadXml(ms) 'Aqui pongo un punto de ruptura

            ms.Close()

            Return ds.Tables(0)

        Catch ex As Exception

            Throw New Exception("Error en StrXml2Table: " & ex.ToString)

        Finally

            If Not sw Is Nothing Then
                sw.Close()
            End If
            If Not ms Is Nothing Then
                ms.Close()
            End If

        End Try

    End Function
Lo que hize es poner un punto de ruptura en ds.ReadXml(ms) e hize una inspeccion rapida de la variable kk y todos los bytes de la matriz estan a 0; y creo que es por eso que me da el error de que falta el elemento raiz.

El contenido,por si sirve de algo, del parametro strXML es:

Código:
<?xml version="1.0" encoding="ISO-8859-1"?>
<ROOT>
<MAESMONBAK_record _ID = "0000" DENOM = "COTO" PROVIN = "21" ESPEC = "041" GRUPOB = "26" DEPART = "CT" DELEG = "08" COMARCA = "01" CLIENTE = "0099" CENTRONEG = "10" GRUPACT = "30" ACTIVIDAD = "170">
  <DPROVIN_MV DPROVIN = "HUELMA"/>
  <DGRUPOB_MV DGRUPOB = "ANTER"/>
</MAESMONBAK_record>
</ROOT>
Un saludo y gracias.
  #6 (permalink)  
Antiguo 31/03/2005, 08:09
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 4 meses
Puntos: 7
Disculpa por enviarte el código sin probar, como indicaste no existía ningún valor en el Stream cuando se ejecutaba ds.ReadXml, aquí te mando la solución corregida.
Código:
Public Function StrXml2Table(ByVal StrXML As String) As DataTable

	Dim ms As MemoryStream
	Dim buf() as Byte

	Try
		Dim ds As New DataSet
		buf= System.Text.ASCIIEncoding.ASCII.GetBytes(StrXML)
		ms = New MemoryStream(buf)
	   
		ds.ReadXml(ms)

		Return ds.Tables(0)
	Catch ex As Exception
		Throw New Exception("Error en StrXml2Table: " & ex.ToString)
	Finally
		If Not sw Is Nothing Then
			sw.Close()
		End If
		If Not ms Is Nothing Then
			ms.Close()
		End If
	End Try
End Function
Saludos
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #7 (permalink)  
Antiguo 01/04/2005, 01:58
 
Fecha de Ingreso: febrero-2005
Mensajes: 18
Antigüedad: 19 años, 2 meses
Puntos: 0
xKnown muchas gracias otra vez (por favor no te disculpes pues eres el unico que me esta intentando solucionar la papeleta ).

Ahora si va todo "bien" (te comento mas abajo lo de las ""), lo que abria que quitar de la ultima version que posteaste es:

Código:
    If Not sw Is Nothing Then
        sw.Close()
    End If
Puesto que la variable sw ya no existe

Lo de "bien" es por lo siguiente:

Le paso a la funcion como parametro strXML=

Código:
<?xml version="1.0" encoding="ISO-8859-1"?>
<ROOT>
<MAESMONBAK DENOM = "COTO" DEPART = "CT" PROVIN = "21" DELEG = "08">
  <DPROVIN_MV DPROVIN = "HUELVA"/>
  <DDELEG_MV DDELEG = "CANTERAS"/>
</MAESMONBAK>
</ROOT>
Y el datatable que me devuelve tiene la columna MAESMONBAK_Id donde indica el numero de orden de registro (esta columna no deberia/querria que apareciera) y la columna DPROVIN no aparece al igual que la columna DGRUPOB.

Código:
Tabla devuelta:
----------------------------------------------------------
|MAESMONBAK_Id  |   DENOM | DEPART | PROVIN | DELEG  |
----------------------------------------------------------
|      0       |    COTO  |    CT     |   21     |   08     |
----------------------------------------------------------

Estara mal la construccion del XML??

Un saludo a todos y mil (y una) gracias.

Última edición por aevora; 01/04/2005 a las 02:14
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 07:06.