Multidesk.be » Forums » Programmeren algemeen » XMLReader in Visual Basic

  • Pagina
  • 1 van 1
0 gasten lezen dit onderwerp.
^ Onderwerp geschreven door steven4ever op maandag 14 maart 2011 om 01:07:09.
steven4ever heeft nog geen avatar toegevoegd
Multiviteit: 206
Hallo nogmaals :)

Ik probeer in VB een xml bestand te lezen en te interpreteren, maar bijzonder ver geraak ik niet. Dit is een voorbeeld van het xml bestand in zijn simpelste vorm:

CODE
  1. <?xml version="1.0" ?>
  2. <command_result>
  3. <param name="protocol_version" value="1"/>
  4. <param name="player_state" value="navigator"/>
  5. </command_result>


Mijn bedoeling is om naar gelang de waarde van "param name" de text van een label te vullen met de waarde bij "value". Maar ik geraak niet uit de documentatie van de XMLReader klasse.

verder dan dit geraak ik niet zonder dat ik compleet foute resultaten krijg:
CODE
  1. Imports System.Xml
  2.  
  3. Public Function test()
  4.     Dim rd As XmlReader = XmlReader.Create("C:\test.xml")
  5.     Do While rd.Read
  6.         If rd.NodeType = XmlNodeType.Element And rd.Name = "command_result" Then
  7.              'hoe lees ik vanaf hier de waarde achter "param name"
  8.               'en de waarde achter "value"?
  9.         End If
  10.     Loop
  11. End Function


Wie kan mij enige duidelijkheid scheppen?
^ Reactie #1 geschreven door thekid op maandag 14 maart 2011 om 10:46:18.
thekid's avatar
Multiviteit: 5273
Moderator
hey

moet het met de xmlreader te doen zijn?

ik vind de xml serializer een stuk eenvoudiger te gebruiken :)

anders kan ik wel vanavond eens rap meekijken :)
"Human beings make life so interesting. Do you know, that in a universe so full of wonders, they have managed to invent boredom." - Death in Hogfather
^ Reactie #2 geschreven door steven4ever op maandag 14 maart 2011 om 15:11:12.
steven4ever heeft nog geen avatar toegevoegd
Multiviteit: 206
nee uiteraard niet, de eerste de beste oplossing is voor mij goed genoeg. Zolang de klus maar geklaard wordt.
^ Reactie #3 geschreven door thekid op maandag 14 maart 2011 om 16:04:20.
thekid's avatar
Multiviteit: 5273
Moderator
in dit geval

op basis van uw bestandje die je me gegevens hebt :

CODE
  1.  
  2. Imports System.Xml.Serialization
  3. Imports System.IO
  4.  
  5. Module Module1
  6.  
  7.     Sub Main()
  8.         Dim cr As CommandResults = CommandResults.FromFile("./testcmd.xml")
  9.  
  10.         If cr IsNot Nothing Then
  11.             Console.WriteLine("Parameters in XML file:")
  12.             For Each CommandParam In cr.Parameters
  13.                 Console.WriteLine("{0}={1}", New Object() {CommandParam.Name, CommandParam.Value})
  14.             Next
  15.             Console.WriteLine("Total nr of params: {0}", cr.Parameters.Count)
  16.         Else
  17.             Console.WriteLine("Something went wrong during parsing or file not found!")
  18.         End If
  19.         Console.ReadLine()
  20.     End Sub
  21.  
  22. End Module
  23.  
  24. <XmlRoot("command_result")>
  25. Public Class CommandResults
  26.     <XmlElement("param")>
  27.     Public Property Parameters As List(Of CommandParam)
  28.  
  29.     Public Shared Function FromFile(ByVal filename As String) As CommandResults
  30.         Try
  31.             Dim cr As New CommandResults
  32.  
  33.             Using fs As New FileStream(filename, FileMode.Open, FileAccess.Read)
  34.                 Dim xs As New XmlSerializer(GetType(CommandResults))
  35.                 cr = DirectCast(xs.Deserialize(fs), CommandResults)
  36.             End Using
  37.  
  38.             Return cr
  39.         Catch ex As Exception
  40.             Console.WriteLine("Couldn't parse {3}! {0}{1}{2}", New Object() {ex.Message, vbCrLf, ex.StackTrace, filename})
  41.             Return Nothing
  42.         End Try
  43.     End Function
  44.  
  45.     Public Sub SaveTo(ByVal filename As String)
  46.         Using fs As New FileStream(filename, FileMode.Create, FileAccess.Write)
  47.             Dim xs As New XmlSerializer(GetType(CommandResults))
  48.             xs.Serialize(fs, Me)
  49.         End Using
  50.     End Sub
  51. End Class
  52.  
  53. Public Class CommandParam
  54.     <XmlAttribute("name")>
  55.     Public Property Name As String
  56.     <XmlAttribute("value")>
  57.     Public Property Value As String
  58. End Class
  59.  



output is dan devolgende
CODE
  1.  
  2. Parameters in XML file:
  3. protocol_version=1
  4. player_state=navigator
  5. Total nr of params: 2
  6.  
"Human beings make life so interesting. Do you know, that in a universe so full of wonders, they have managed to invent boredom." - Death in Hogfather
^ Reactie #4 geschreven door steven4ever op maandag 14 maart 2011 om 17:03:04.
steven4ever heeft nog geen avatar toegevoegd
Multiviteit: 206
Bedankt. Ik heb bovenstaande code geprobeerd en het werkt voor lokale bestanden. Maar wanneer ik het xml bestand van een URL probeer te laden kom ik niet verder dan
CODE
  1. Using fs As New FileStream(filename, FileMode.Open, FileAccess.Read)
waarbij filename = "http://192.168.1.142/cgi-bin/do?cmd=status"

Ik krijg dan de volgende fout:

CODE
  1. Couldn't parse http://192.168.1.142/cgi-bin/do?cmd=status! URI-indelingen worden niet ondersteund.
  2.    bij System.IO.Path.NormalizePath(String path, Boolean fullCheck, Int32 maxPathLength)
  3.    bij System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath)
  4.    bij System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access)
  5.    bij DuneRemote.CommandResults.FromFile(String filename) in C:\Users\Steven\Documents\Visual Studio 2010\Projects\DuneRemote\DuneRemote\mdlXML.vb:regel 30
  6. Something went wrong during parsing or file not found!


hulp? %-)

EDIT: misschien gemakkelijker op te lossen met de link: http://84.197.182.88:2222/cgi-bin/do?cmd=status
Deze tekst werd het laatst bewerkt voor 4.57 % door steven4ever op maandag 14 maart 2011 om 17:06:52.
^ Reactie #5 geschreven door thekid op maandag 14 maart 2011 om 17:11:13.
thekid's avatar
Multiviteit: 5273
Moderator
de foutmelding gaat over de URI

download de file eerst voor je deze gaat parsen

zoek anders wat info over de HttpWebRequest / HttpWebResponse en WebRequestMethod.HTTP.Get (ben ik niet zeker, ken ze niet direct van buiten :)) om uw bestand eerst te downloaden, je kan dan eventueel rechtstreeks met de response stream gaan werken (dan hoef je het niet lokaal te bewaren alvorens in te lezen)

ik wil je de code voor de httpwebrequest ook wel geven, maar zit op mijn werk momenteel ;)
"Human beings make life so interesting. Do you know, that in a universe so full of wonders, they have managed to invent boredom." - Death in Hogfather
^ Reactie #6 geschreven door steven4ever op maandag 14 maart 2011 om 17:37:12.
steven4ever heeft nog geen avatar toegevoegd
Multiviteit: 206
ok bedankt, zal zien hoe ver ik ermee kom :D
^ Reactie #7 geschreven door thekid op maandag 14 maart 2011 om 20:59:33.
thekid's avatar
Multiviteit: 5273
Moderator
ok, als je een spoiler wilt kan je hier altijd eens kijken :)


ik heb wel de code wat moeten aanpassen omdat ik het in mono heb geschreven, dus de .net 4 versie van Property declaratie, is gewoon terug gegaan naar public members en voor de declaratie van de xml attributen is er een underscore bijgekomen op het einde van de lijnen

en vb.net is zonder code completion in mono :s had toch effekes C# nodig om het om te zetten :D

en in mono moet ik ook al de references afzonderlijk importeren :) waardoor je nu wel de imports ziet staan voor de collections, filestreams

de .net is erbij gekomen voor de httpwebrequest. In theorie zitten de meeste formaten ingebouwd :)

mag ik trouwens vragen waarom je eventueel geen gebruikt maakt van services? Visual studio kan dat heel gemakkelijk maken hoor :) en dan gaat alles via classes en de service :)

CODE
  1.  
  2. Imports System.Xml.Serialization
  3. Imports System.IO
  4. Imports System.Collections.Generic
  5. Imports System.Net
  6.  
  7. Module Module1
  8.  
  9.     Sub Main()
  10.         Dim cr As CommandResults = CommandResults.FromUrl("http://84.197.182.88:2222/cgi-bin/do?cmd=status")
  11.  
  12.         If cr IsNot Nothing Then
  13.             Console.WriteLine("Parameters in XML file:")
  14.             For Each comm as CommandParam In cr.Parameters
  15.                 Console.WriteLine("{0}={1}", New Object() {comm.Name, comm.Value})
  16.             Next
  17.             Console.WriteLine("Total nr of params: {0}", cr.Parameters.Count)
  18.         Else
  19.             Console.WriteLine("Something went wrong during parsing or file not found!")
  20.         End If
  21.         Console.ReadLine()
  22.     End Sub
  23.  
  24. End Module
  25.  
  26. <XmlRoot("command_result")> _
  27. Public Class CommandResults
  28.     <XmlElement("param")> _
  29.     Public Parameters As List(Of CommandParam)
  30.  
  31.     Public Shared Function FromFile(ByVal filename As String) As CommandResults
  32.         Try
  33.             Dim cr As New CommandResults
  34.  
  35.             Using fs As New FileStream(filename, FileMode.Open, FileAccess.Read)
  36.                 Dim xs As New XmlSerializer(GetType(CommandResults))
  37.                 cr = DirectCast(xs.Deserialize(fs), CommandResults)
  38.             End Using
  39.  
  40.             Return cr
  41.         Catch ex As Exception
  42.             Console.WriteLine("Couldn't parse {3}! {0}{1}{2}", New Object() {ex.Message, vbCrLf, ex.StackTrace, filename})
  43.             Return Nothing
  44.         End Try
  45.     End Function
  46.    
  47.     Public Shared Function FromUrl(byval url as String) as CommandResults
  48.         Try
  49.             Dim req as HttpWebRequest = DirectCast(WebRequest.Create(url), HttpWebRequest)
  50.             req.Method = WebRequestMethods.Http.Get
  51.             dim res as HttpWebResponse = DirectCast(req.GetResponse(), HttpWebResponse)
  52.            
  53.             Dim cr As New CommandResults
  54.             Using fs As Stream = res.GetResponseStream()
  55.                 Dim xs As New XmlSerializer(GetType(CommandResults))
  56.                 cr = DirectCast(xs.Deserialize(fs), CommandResults)
  57.             End Using
  58.             Return cr
  59.  
  60.         Catch ex as Exception
  61.             Console.WriteLine("Couldn't parse from web {3}! {0}{1}{2}", New Object() {ex.Message, vbCrLf, ex.StackTrace, url})
  62.             Return Nothing
  63.         End Try
  64.     End Function
  65.  
  66.     Public Sub SaveTo(ByVal filename As String)
  67.         Using fs As New FileStream(filename, FileMode.Create, FileAccess.Write)
  68.             Dim xs As New XmlSerializer(GetType(CommandResults))
  69.             xs.Serialize(fs, Me)
  70.         End Using
  71.     End Sub
  72. End Class
  73.  
  74. Public Class CommandParam
  75.     <XmlAttribute("name")> _
  76.     Public Name As String
  77.     <XmlAttribute("value")> _
  78.     Public Value As String
  79. End Class
  80.  


met als huidige output
CODE
  1.  
  2. Parameters in XML file:
  3. protocol_version=1
  4. player_state=file_playback
  5. playback_speed=0
  6. playback_duration=0
  7. playback_position=0
  8. playback_is_buffering=0
  9. Total nr of params: 6
  10.  

Deze tekst werd het laatst bewerkt voor 27.26 % door thekid op maandag 14 maart 2011 om 21:01:41.
"Human beings make life so interesting. Do you know, that in a universe so full of wonders, they have managed to invent boredom." - Death in Hogfather
^ Reactie #8 geschreven door steven4ever op dinsdag 15 maart 2011 om 10:30:56.
steven4ever heeft nog geen avatar toegevoegd
Multiviteit: 206
Prachtig! (thumbsup) Een betere aanpak kan ik mij nauwelijks voorstellen :). Ik ben nog niet zo ver gevorderd in VB (heb zelfs geen idee wat u bedoelt met services), maar hier kan ik zelfs mee werken! :D

Het eerste resultaat van mijn brouwsel:

Bijlage: 463da8cf5a50e6b49397d2a0098e5829.png

Nu nog een beetje verder verwerken zodat het in duidelijke mensentaal weergegeven wordt + mijn interface afwerken (voornamelijk de knopjes :D).
Het gaat trouwens om een afstandsbediening voor Dune spelers (http://dune-hd.com/). Ze hebben vrij recent een firmware met IP control vrijgegeven, maar er is nergens een interface te bespeuren (althans voor Windows, er bestaat wel een applicatie voor iphone/ipod touch/ipad).
^ Reactie #9 geschreven door thekid op dinsdag 15 maart 2011 om 11:44:30.
thekid's avatar
Multiviteit: 5273
Moderator
blij te horen, als er nog vragen zijn moet je ze maar stellen :)
"Human beings make life so interesting. Do you know, that in a universe so full of wonders, they have managed to invent boredom." - Death in Hogfather
  • Pagina
  • 1 van 1

Snel-antwoordformulier
Toon uitgebreid antwoordformulier Bericht nalezen Bericht plaatsen