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:
<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:
Dim MyDoc As New System.Xml.XmlDocument
MyDoc.LoadXml(XmlData)
MyDoc.SelectSingleNode("//Nodo/Nodo2/Nodo3/Dato").InnerText
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
Cita de: EleKtro H@cker en 3 Diciembre 2013, 19:16 PM
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
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)
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:
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:
CitarDim MyDoc As New System.Xml.XmlDocument
MyDoc.LoadXml(content)
PD: también puedes hacerlo todo de una:
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
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
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
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:
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!
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
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