[Ayuda]Xml y Listbox VB.NET

Iniciado por TMarmol, 3 Diciembre 2013, 18:49 PM

0 Miembros y 1 Visitante están viendo este tema.

TMarmol

Necesito que mi programa lea un archivo xml online ( hasta ahi no tengo problema) la cosa es que hay un archivo que tiene nodos (creo que se llaman así ;D) con el mismo nombre, necesito que se añadan los valores de esos nodos a un listbox

Xml:
Código (xml) [Seleccionar]

<friendslist>
   <friends>
      <friend>
         <Dato>Valor</Dato>
      </friend>
      <friend>
         <Dato>Valor</Dato>
      </friend>
      <friend>
         <Dato>Valor</Dato>
      </friend>
      <friend>
         <Dato>Valor</Dato>
      </friend>
      <friend>
         <Dato>Valor</Dato>
      </friend>
   </friends>
</friendslist>

     La longitud del archivo es variable.
     La palabra que sustituye a "Dato", es siempre la misma

Necesitaria que en un listbox aparecieran todos los valores, he probado con un bucle for, pero no he conseguido resultado
La forma en la que obtengo los datos del xml es la siguiente:
Código (vb) [Seleccionar]
Dim MyDoc As New System.Xml.XmlDocument
        MyDoc.LoadXml(XmlData)
        MyDoc.SelectSingleNode("//Nodo/Nodo2/Nodo3/Dato").InnerText


Eleкtro

#1
Código (vbnet) [Seleccionar]
Public Class Form1

   ' Genero el documento XML.
   ReadOnly xml As System.Xml.Linq.XDocument =
   <?xml version="1.0" encoding="Windows-1252"?>
   <friendslist>
       <friends>
           <friend><Dato>Valor1</Dato></friend>
           <friend><Dato>Valor2</Dato></friend>
           <friend><Dato>Valor3</Dato></friend>
           <friend><Dato>Valor4</Dato></friend>
           <friend><Dato>Valor5</Dato></friend>
       </friends>
   </friendslist>

   Shadows Sub Load() Handles MyBase.Load

       ' Proyecto los elementos deseados en un type anónimo.
       Dim datos = From _friend As System.Xml.Linq.XElement
                   In xml.<friendslist>.<friends>.<friend>
                   Select New With {_friend.<Dato>.Value}

       ' Añado el miembro "Dato" al Listbox.
       ListBox1.Items.AddRange(datos.Select(Function(element) element.Dato).ToArray)

   End Sub

End Class


Saludos








TMarmol

Cita de: EleKtro H@cker en  3 Diciembre 2013, 19:16 PM
Código (vbnet) [Seleccionar]
Lo he borrado para ahorrar espacio
Saludos
No es exactamente lo que busco, en tu código esta incluido el código xml, mi programa lo obtiene leyéndolo de una web mediante Openread, obtengo una string.
He modificado tu código para que funcionase con lo que tengo, pero aun así en el listbox no sale nada
Código (vb) [Seleccionar]
Dim web As WebClient = New WebClient()
        Dim stream As Stream = web.OpenRead("http://URLDEPAGINAWEBCONXML")
        Dim reader As StreamReader = New StreamReader(stream)
        Dim content As String = reader.ReadToEnd
        Datos(content) ' --Una función que tengo en otra parte
        Dim MyDoc As New System.Xml.XmlDocument
        MyDoc.LoadXml(content)
        Dim doc As XDocument = XDocument.Parse(content)
        Dim datas = (From _friend In doc.<friendslist>.<friends>.<friend>
                  Select New With {_friend.<Dato>.Value})

        ListBox1.Items.AddRange(datas.Select(Function(x) x.Dato).ToArray)

Eleкtro

#3
Cita de: TMarmol en  3 Diciembre 2013, 19:37 PM
No es exactamente lo que busco, en tu código esta incluido el código xml, mi programa lo obtiene leyéndolo de una web mediante Openread, obtengo una string.

El código que mostré es un ejemplo, puedes adaptarlo para leer diréctamente el string:

Código (vbnet) [Seleccionar]

Dim datos = From _friend As System.Xml.Linq.XElement
           In XDocument.Parse(xml).<friendslist>.<friends>.<friend>
           Select New With {_friend.<Dato>.Value}


EDITO:
En el código que has mostrado estás usando/cargando un XmlDocument y un XDocument, elige uno de los dos, elimina estas lineas de tú código:
Citar
Código (vbnet) [Seleccionar]
Dim MyDoc As New System.Xml.XmlDocument
MyDoc.LoadXml(content)

PD: también puedes hacerlo todo de una:

Código (vbnet) [Seleccionar]
ListBox1.Items.AddRange(
   (From _friend As XElement
    In XDocument.Parse(xml).<friendslist>.<friends>.<friend>
    Select New With {_friend.<Dato>.Value}
   ).Select(Function(element) element.Dato).ToArray
)


saludos








TMarmol

Cita de: EleKtro H@cker en  3 Diciembre 2013, 19:44 PM
El código que mostré es un ejemplo, puedes adaptarlo para leer diréctamente el string:

EDITO:
En el código que has mostrado estás usando/cargando un XmlDocument y un XDocument, elige uno de los dos, elimina estas lineas de tú código:
PD: también puedes hacerlo todo de una:

saludos
He hecho lo que me has dicho y sigue sin pasar nada
Código (vbnet) [Seleccionar]
    Public Function Amigos()
        On Error Resume Next
        Dim web As WebClient = New WebClient()
        Dim stream As Stream = web.OpenRead("http://URLXML")
        Dim reader As StreamReader = New StreamReader(stream)
        Dim content As String = reader.ReadToEnd
        Datos(content)
        Dim datas = From _friend As System.Xml.Linq.XElement
            In System.Xml.Linq.XDocument.Parse(content).<friendslist>.<friends>.<friend>
            Select New With {_friend.<Dato>.Value}
        ListBox1.Items.AddRange(datas.Select(Function(element) element.Dato).ToArray)
    End Function

Eleкtro

#5
EDITO:
primero de nada, elimina esta linea:
On Error Resume Next

No uses esa instrucción jamás, usa un try/catch ordinario para que, si hubiese error, puedas ser informado del detalle del error.

Aparte de eso, desconozco lo que hace tu método Datos, si el parámetro que recibe la función es ByRef entonces ¿has comprobado si después de llamar a la función el contenido del string "content" es el mismo?,
quiero decir, ¿has comprobado que "content" es string válido antes de parsearlo?,
¿has comprobado también si las mayúsculas/minúsculas de los nodos son correctas? (.<friendslist>.<friends>.<friend> {_friend.<Dato>)).

EDITO 2:
Esto no tiene tanta relevancia, pero la función "Amigos" no devuelve ningún valor ni tampoco le has asignado un datatype de retorno, tu función en realidad es un sub, deberías modifícarlo corréctamente.

EDITO3:

Prueba a hacerlo de esta manera:
Código (vbnet) [Seleccionar]

   Private Sub Amigos()

       Dim reader As IO.StreamReader = Nothing
       Dim content As String = Nothing
       Dim friends = Nothing

       Try

           reader = New IO.StreamReader(Net.HttpWebRequest.Create("http:\\urlxml").
                                        GetResponse().GetResponseStream())

           content = reader.ReadToEnd()

           Datos(content)

           friends = From _friend As XElement
                      In XDocument.Parse(content).<friendslist>.<friends>.<friend>
                      Select New With {_friend.<Dato>.Value}

           ListBox1.Items.AddRange(friends.Select(Function(f) f.Dato).ToArray)

       Catch ex As Exception
           MsgBox(ex.Message & ex.StackTrace)

       Finally
           reader.Close()

       End Try

   End Sub


Saludos!








TMarmol

Cita de: EleKtro H@cker en  3 Diciembre 2013, 20:09 PM
EDITO:
primero de nada, elimina esta linea:
On Error Resume Next

No uses esa instrucción jamás, usa un try/catch ordinario para que, si hubiese error, puedas ser informado del detalle del error.

Aparte de eso, desconozco lo que hace tu método Datos, si el parámetro que recibe la función es ByRef entonces ¿has comprobado si después de llamar a la función el contenido del string "content" es el mismo?,
quiero decir, ¿has comprobado que "content" es string válido antes de parsearlo?,
¿has comprobado también si las mayúsculas/minúsculas de los nodos son correctas? (.<friendslist>.<friends>.<friend> {_friend.<Dato>)).

EDITO 2:
PD: Esto no tiene tanta relevancia, pero la función "Amigos" no devuelve ningún valor ni tampoco le has asignado un datatype de retorno, tu función en realidad es un sub, deberías modifícarlo corréctamente.

Saludos!

He comprobado lo ultimo que me has dicho, el host estaba dando fallos y debido al
On Error Resume Next
no me lo notificaba, ya he corregido todo lo demás y funciona a la perfeccion, Gracias por tu ayuda y por tu tiempo
Te lo agradezco.
Te mencionare en el "About"  ;D

Eleкtro

Cita de: TMarmol en  3 Diciembre 2013, 20:33 PMTe mencionare en el "About"  ;D
xD

De nada, para eso estamos,
me alegro de que lo consiguieras.

PD: le hice una última modificación al código que te propuse en el comentario de arriba, míralo si lo quieres testear.

Saludos