XML auslesen für Anfänger

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von eXtense.

    XML auslesen für Anfänger

    Hallo,
    ich bin bislang noch nicht viel auf XML gestoßen da ich Delphi & Visual Basic lediglich auf Schulniveau programmiere da ich diese noch nicht abgeschlossen habe.
    Ich möchte nun eine vorliegende XML-Datei, welche vom Flight Simulator X als Flugplan ausgegeben wird auslesen und anzeigen lassen.
    Ich habe mich nun ca. eine Woche mit Google durch unzählige Links & Foren gekämpft und auch viel gefunden. Allerdings komme ich bei NICHTS davon weiter.
    Könnte mir jemand das ganze möglichst detailreich aber trotzdem gut verständlich, schritt für schritt, erklären? Vielen Dank.

    Hier mal eine Beispiel XML. Es sollen die rot markierten Werte ausgelesen werden. Die XML ist in diesem Beitrag absichtlich nicht als XML formatiert, da die Formatierung das ganze farblich bis zur Unkenntlichkeit entstellt hat.
    Spoiler anzeigen
    <?xml version="1.0" encoding="UTF-8"?>

    <SimBase.Document Type="AceXML" version="1,0">
    <Descr>AceXML Document</Descr>
    <FlightPlan.FlightPlan>
    <Title>KORD to KMDW</Title>
    <FPType>VFR</FPType>
    <CruisingAlt>3500</CruisingAlt>
    <DepartureID>KORD</DepartureID>
    <DepartureLLA>N41° 57' 48.97",W87° 54' 10.12",+000668.00</DepartureLLA>
    <DestinationID>KMDW</DestinationID>
    <DestinationLLA>N41° 46' 45.66",W87° 45' 32.68",+000620.00</DestinationLLA>
    <Descr>KORD, KMDW</Descr>
    <DeparturePosition>32L</DeparturePosition>
    <DepartureName>Chicago-O&apos;Hare Intl</DepartureName>
    <DestinationName>Chicago Midway Intl</DestinationName>
    <AppVersion>
    <AppVersionMajor>10</AppVersionMajor>
    <AppVersionBuild>61637</AppVersionBuild>
    </AppVersion>
    <ATCWaypoint id="KORD">
    <ATCWaypointType>Airport</ATCWaypointType>
    <WorldPosition>N41° 57' 48.97",W87° 54' 10.12",+000668.00</WorldPosition>
    <ICAO>
    <ICAOIdent>KORD</ICAOIdent>
    </ICAO>
    </ATCWaypoint>
    <ATCWaypoint id="KMDW">
    <ATCWaypointType>Airport</ATCWaypointType>
    <WorldPosition>N41° 46' 45.66",W87° 45' 32.68",+000620.00</WorldPosition>
    <ICAO>
    <ICAOIdent>KMDW</ICAOIdent>
    </ICAO>
    </ATCWaypoint>
    </FlightPlan.FlightPlan>
    </SimBase.Document>


    Grüße,
    eXtense
    Habe bei MSDN einen code gefunden. Er ist auch sehr gut Kommentier, vielleicht hilft er dir ja

    VB.NET-Quellcode

    1. Private Sub XMLReader()
    2. ' Wir benötigen einen XmlReader für das Auslesen der XML-Datei
    3. Dim XMLReader As Xml.XmlReader _
    4. = New Xml.XmlTextReader("quickie.xml")
    5. ' Es folgt das Auslesen der XML-Datei
    6. With XMLReader
    7. Do While .Read ' Es sind noch Daten vorhanden
    8. ' Welche Art von Daten liegt an?
    9. Select Case .NodeType
    10. ' Ein Element
    11. Case Xml.XmlNodeType.Element
    12. Console.WriteLine("Es folgt ein Element vom Typ " & .Name)
    13. ' Alle Attribute (Name-Wert-Paare) abarbeiten
    14. If .AttributeCount > 0 Then
    15. ' Es sind noch weitere Attribute vorhanden
    16. While .MoveToNextAttribute ' nächstes
    17. Console.WriteLine("Feldname: " & .Name & _
    18. " -> " & _
    19. "Feldwert: " & .Value)
    20. End While
    21. End If
    22. ' Ein Text
    23. Case Xml.XmlNodeType.Text
    24. Console.WriteLine("Es folgt ein Text: " & .Value)
    25. ' Ein Kommentar
    26. Case Xml.XmlNodeType.Comment
    27. Console.WriteLine("Es folgt ein Kommentar: " & .Value)
    28. End Select
    29. Loop ' Weiter nach Daten schauen
    30. .Close() ' XMLTextReader schließen
    31. End With
    32. ' Und so sieht das Ergebnis der Ausgabe aus:
    33. ' ------------------------------------------
    34. 'Es folgt ein Element vom Typ Personen
    35. 'Es folgt ein Element vom Typ Person
    36. 'Feldname: Titel -> Feldwert: Dr.
    37. 'Feldname: Name -> Feldwert: Meyer
    38. 'Feldname: Vorname -> Feldwert: Hans
    39. 'Es folgt ein Element vom Typ Person
    40. 'Feldname: Titel -> Feldwert:
    41. 'Feldname: Name -> Feldwert: Schmidt
    42. 'Feldname: Vorname -> Feldwert: Carlos
    43. End Sub


    Gruß Chris
    Genau diesen hatte ich auch schon gefunden und versucht zu verwenden. Wahrscheinlich übersehe ich etwas ganz simples aber ich habe keine Ahnung wie ich wo welchen Wert in einem Label ausgeben lassen kann 8|
    Desweiteren möchte ich ja nicht alle Werte sondern nur bestimmte ausgeben lassen.

    VB.NET-Quellcode

    1. Public Class Form2
    2. Dim xDoc As XDocument _
    3. = <?xml version="1.0" encoding="UTF-8"?>
    4. <SimBase.Document Type="AceXML" version="1,0">
    5. <Descr>AceXML Document</Descr>
    6. <FlightPlan.FlightPlan>
    7. <Title>KORD to KMDW</Title>
    8. <FPType>VFR</FPType>
    9. <CruisingAlt>3500</CruisingAlt>
    10. <DepartureID>KORD</DepartureID>
    11. <DepartureLLA>N41° 57' 48.97",W87° 54' 10.12",+000668.00</DepartureLLA>
    12. <DestinationID>KMDW</DestinationID>
    13. <DestinationLLA>N41° 46' 45.66",W87° 45' 32.68",+000620.00</DestinationLLA>
    14. <Descr>KORD, KMDW</Descr>
    15. <DeparturePosition>32L</DeparturePosition>
    16. <DepartureName>Chicago-O&apos;Hare Intl</DepartureName>
    17. <DestinationName>Chicago Midway Intl</DestinationName>
    18. <AppVersion>
    19. <AppVersionMajor>10</AppVersionMajor>
    20. <AppVersionBuild>61637</AppVersionBuild>
    21. </AppVersion>
    22. <ATCWaypoint id="KORD">
    23. <ATCWaypointType>Airport</ATCWaypointType>
    24. <WorldPosition>N41° 57' 48.97",W87° 54' 10.12",+000668.00</WorldPosition>
    25. <ICAO>
    26. <ICAOIdent>KORD</ICAOIdent>
    27. </ICAO>
    28. </ATCWaypoint>
    29. <ATCWaypoint id="KMDW">
    30. <ATCWaypointType>Airport</ATCWaypointType>
    31. <WorldPosition>N41° 46' 45.66",W87° 45' 32.68",+000620.00</WorldPosition>
    32. <ICAO>
    33. <ICAOIdent>KMDW</ICAOIdent>
    34. </ICAO>
    35. </ATCWaypoint>
    36. </FlightPlan.FlightPlan>
    37. </SimBase.Document>
    38. Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    39. Dim src = xDoc.<SimBase.Document>.<FlightPlan.FlightPlan>
    40. Dim fpType = src.<FPType>.Value
    41. Dim DepartureID = src.<DepartureID>.Value
    42. Dim DestinationID = src.<DestinationID>.Value
    43. Dim DeparturePosition = src.<DeparturePosition>.Value
    44. Dim DepartureName = src.<DepartureName>.Value
    45. Dim DestinationName = src.<DestinationName>.Value
    46. End Sub
    47. End Class
    @Vorposter: Ist ja eklig, das geht?! Direkt so in den Code schreiben?!
    Aber Variablentypen wären trotzdem nicht schlecht, das gehört zum guten Stil :P
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    @extense: guck dir im Objectbrowser mal XDocument an - da kommstedann schon drauf.

    Infos u.a. zum OB :Möglichkeiten der Informationsgewinnung

    jvbsl schrieb:

    @Vorposter: Ist ja eklig, das geht?! Direkt so in den Code schreiben?!
    Aber Variablentypen wären trotzdem nicht schlecht, das gehört zum guten Stil :P

    Na, das ist ein Feature, was VB dem c# vorraus hat :thumbsup: .
    Das Feature besteht nicht eiglich darin, dass man Xml direkt in den Code schreiben kann, sondern das <blabla> ein Wert vom Typ XDocument ist.
    und XDocument.<blabla> hat den Typ IEnumerable(Of XElement)
    Könnte man auch so schreiben: XDocument.Elements("blabla")

    Und bei Option Infer erkennt der Compiler selbst, welchen Typ eine Variable hat.
    Das ist nicht nur praktisch zu schreiben, sondern auch guter Stil, weil ich so zb Rückgabewerte selbstgeproggter Methoden ändern kann , ohne alle Stellen, wos verwendet wird, nacharbeiten zu müssen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    weiß dass das Prog erst beim Ausführen, oder kann es das auch bereits vorraussagen?! Sonst bringt Option Strict ON bei Typenkonvertierungen ja auch gar nichts mehr...
    Außerdem denke ich, dass es auch für den Leser schöner ist, dass er bereits den Type einer Variable kennt, ohne dass diese zugewiesen worden ist...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Das weiß bereits der Compiler, und damit die Intellisense auch.
    Im Zweifel siehst du also den Typ, wennde die Maus drüberhältst.
    Aber die meisten RückgabeTypen kennt man schon beim Lesen, weil manja damit arbeitet.
    .<blabla> mag da eine unrühmliche Ausnahme sein (wennmannochnich damit gearbeitet hat), aber die Variante mit expliziter Typangabe findich unschön lang:

    VB.NET-Quellcode

    1. Dim src as IEnumerable(Of XElement) = xDoc.<SimBase.Document>.<FlightPlan.FlightPlan>

    Expliziter Typangabe Geht natürlich immer noch, und ist erforderlich, wenn man was polymorphes vorhat, also an eine Variable der BasisKlasse oder Interface zuweisen will

    VB.NET-Quellcode

    1. Dim lst As IList = New List(Of String)({"Hallo", "Welt"})
    Wie gesagt, für mich ist das ganze erledigt & Ich bedanke mich für den Beitrag von ErfinderDesRades.
    Es war ja kein Problem die XML einfach durch eine Pfadangabe zu ersetzen und schon funktioniert alles.
    Done. Thx!

    Grüße,
    eXtense