Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: TMarmol en 3 Diciembre 2013, 18:49 pm



Título: [Ayuda]Xml y Listbox VB.NET
Publicado por: TMarmol en 3 Diciembre 2013, 18:49 pm
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
  1. <friendslist>
  2.   <friends>
  3.      <friend>
  4.         <Dato>Valor</Dato>
  5.      </friend>
  6.      <friend>
  7.         <Dato>Valor</Dato>
  8.      </friend>
  9.      <friend>
  10.         <Dato>Valor</Dato>
  11.      </friend>
  12.      <friend>
  13.         <Dato>Valor</Dato>
  14.      </friend>
  15.      <friend>
  16.         <Dato>Valor</Dato>
  17.      </friend>
  18.   </friends>
  19. </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
  1. Dim MyDoc As New System.Xml.XmlDocument
  2.        MyDoc.LoadXml(XmlData)
  3.        MyDoc.SelectSingleNode("//Nodo/Nodo2/Nodo3/Dato").InnerText


Título: Re: [Ayuda]Xml y Listbox VB.NET
Publicado por: Eleкtro en 3 Diciembre 2013, 19:16 pm
Código
  1. Public Class Form1
  2.  
  3.    ' Genero el documento XML.
  4.    ReadOnly xml As System.Xml.Linq.XDocument =
  5.    <?xml version="1.0" encoding="Windows-1252"?>
  6.    <friendslist>
  7.        <friends>
  8.            <friend><Dato>Valor1</Dato></friend>
  9.            <friend><Dato>Valor2</Dato></friend>
  10.            <friend><Dato>Valor3</Dato></friend>
  11.            <friend><Dato>Valor4</Dato></friend>
  12.            <friend><Dato>Valor5</Dato></friend>
  13.        </friends>
  14.    </friendslist>
  15.  
  16.    Shadows Sub Load() Handles MyBase.Load
  17.  
  18.        ' Proyecto los elementos deseados en un type anónimo.
  19.        Dim datos = From _friend As System.Xml.Linq.XElement
  20.                    In xml.<friendslist>.<friends>.<friend>
  21.                    Select New With {_friend.<Dato>.Value}
  22.  
  23.        ' Añado el miembro "Dato" al Listbox.
  24.        ListBox1.Items.AddRange(datos.Select(Function(element) element.Dato).ToArray)
  25.  
  26.    End Sub
  27.  
  28. End Class

Saludos


Título: Re: [Ayuda]Xml y Listbox VB.NET
Publicado por: TMarmol en 3 Diciembre 2013, 19:37 pm
Código
  1. 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
  1. Dim web As WebClient = New WebClient()
  2.        Dim stream As Stream = web.OpenRead("http://URLDEPAGINAWEBCONXML")
  3.        Dim reader As StreamReader = New StreamReader(stream)
  4.        Dim content As String = reader.ReadToEnd
  5.        Datos(content) ' --Una función que tengo en otra parte
  6.        Dim MyDoc As New System.Xml.XmlDocument
  7.        MyDoc.LoadXml(content)
  8.        Dim doc As XDocument = XDocument.Parse(content)
  9.        Dim datas = (From _friend In doc.<friendslist>.<friends>.<friend>
  10.                  Select New With {_friend.<Dato>.Value})
  11.  
  12.        ListBox1.Items.AddRange(datas.Select(Function(x) x.Dato).ToArray)
  13.  


Título: Re: [Ayuda]Xml y Listbox VB.NET
Publicado por: Eleкtro en 3 Diciembre 2013, 19:44 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
  1. Dim datos = From _friend As System.Xml.Linq.XElement
  2.            In XDocument.Parse(xml).<friendslist>.<friends>.<friend>
  3.            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
  1. Dim MyDoc As New System.Xml.XmlDocument
  2. MyDoc.LoadXml(content)

PD: también puedes hacerlo todo de una:

Código
  1. ListBox1.Items.AddRange(
  2.    (From _friend As XElement
  3.     In XDocument.Parse(xml).<friendslist>.<friends>.<friend>
  4.     Select New With {_friend.<Dato>.Value}
  5.    ).Select(Function(element) element.Dato).ToArray
  6. )

saludos


Título: Re: [Ayuda]Xml y Listbox VB.NET
Publicado por: TMarmol en 3 Diciembre 2013, 20:04 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
  1.    Public Function Amigos()
  2.        On Error Resume Next
  3.        Dim web As WebClient = New WebClient()
  4.        Dim stream As Stream = web.OpenRead("http://URLXML")
  5.        Dim reader As StreamReader = New StreamReader(stream)
  6.        Dim content As String = reader.ReadToEnd
  7.        Datos(content)
  8.        Dim datas = From _friend As System.Xml.Linq.XElement
  9.            In System.Xml.Linq.XDocument.Parse(content).<friendslist>.<friends>.<friend>
  10.            Select New With {_friend.<Dato>.Value}
  11.        ListBox1.Items.AddRange(datas.Select(Function(element) element.Dato).ToArray)
  12.    End Function


Título: Re: [Ayuda]Xml y Listbox VB.NET
Publicado por: Eleкtro en 3 Diciembre 2013, 20:09 pm
EDITO:
primero de nada, elimina esta linea:
Código:
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
  1.    Private Sub Amigos()
  2.  
  3.        Dim reader As IO.StreamReader = Nothing
  4.        Dim content As String = Nothing
  5.        Dim friends = Nothing
  6.  
  7.        Try
  8.  
  9.            reader = New IO.StreamReader(Net.HttpWebRequest.Create("http:\\urlxml").
  10.                                         GetResponse().GetResponseStream())
  11.  
  12.            content = reader.ReadToEnd()
  13.  
  14.            Datos(content)
  15.  
  16.            friends = From _friend As XElement
  17.                       In XDocument.Parse(content).<friendslist>.<friends>.<friend>
  18.                       Select New With {_friend.<Dato>.Value}
  19.  
  20.            ListBox1.Items.AddRange(friends.Select(Function(f) f.Dato).ToArray)
  21.  
  22.        Catch ex As Exception
  23.            MsgBox(ex.Message & ex.StackTrace)
  24.  
  25.        Finally
  26.            reader.Close()
  27.  
  28.        End Try
  29.  
  30.    End Sub

Saludos!


Título: Re: [Ayuda]Xml y Listbox VB.NET
Publicado por: TMarmol en 3 Diciembre 2013, 20:33 pm
EDITO:
primero de nada, elimina esta linea:
Código:
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
Código:
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


Título: Re: [Ayuda]Xml y Listbox VB.NET
Publicado por: Eleкtro en 3 Diciembre 2013, 20:36 pm
Te 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