XMLReader - Subnode auslesen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    XMLReader - Subnode auslesen

    Hallo Leute,

    irgendwie stehe ich grad voll aufm Schlauch.
    Ich will aus folgender XML-Datei die Feldwerte von lon und lat sowie die Texte von ele und time auslesen:

    XML-Quellcode

    1. <trk>
    2. <name>Day 20-JUN-12 09:02:49</name>
    3. <trkseg>
    4. <trkpt lon="14.600851" lat="51.686424">
    5. <ele>107.32</ele>
    6. <time>2012-06-20T07:02:49Z</time>
    7. </trkpt>
    8. </trkseg>
    9. </trk>


    Jetzt bekomme ich es irgendwie nicht hin den Subnode ele und time auszugeben.
    Hat jemand hierfür einen Denkanstoß für mich oder geht das ganze vielleicht sogar noch etwas eleganter?

    VB.NET-Quellcode

    1. Dim XMLReader As Xml.XmlReader = New Xml.XmlTextReader("Test.xml")
    2. With XMLReader
    3. Do While .Read
    4. If .NodeType = Xml.XmlNodeType.Element And .Name = "trkpt" Then
    5. If .AttributeCount > 0 Then
    6. While .MoveToNextAttribute
    7. If .Name = "lat" Then MsgBox("lat: " & .Value)
    8. If .Name = "lon" Then MsgBox("lon:" & .Value)
    9. End While
    10. End If
    11. 'wie ele und time auslesen?
    12. End If
    13. Loop
    14. .Close()

    KabelMops schrieb:

    etwas eleganter
    geht dasd mit XDocument. Gugst Du hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke, mit einer einfachen xml geht das, jedoch nicht mit meiner vorliegenden:

    XML-Quellcode

    1. <?xml version="1.0" encoding="UTF-8" standalone="no" ?><gpx xmlns="http://www.topografix.com/GPX/1/1" xmlns:gpxx="http://www.garmin.com/xmlschemas/WaypointExtension/v1" xmlns:gpxtrx="http://www.garmin.com/xmlschemas/GpxExtensions/v3" xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1" creator="Oregon 550" version="1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/WaypointExtension/v1 http://www8.garmin.com/xmlschemas/WaypointExtensionv1.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd"><trk><name>Day 20-JUN-12 09:02:49</name><extensions><gpxtrx:TrackExtension><gpxtrx:DisplayColor>DarkRed</gpxtrx:DisplayColor></gpxtrx:TrackExtension></extensions><trkseg><trkpt lat="51.686424" lon="14.600851"><ele>107.32</ele><time>2012-06-20T07:02:49Z</time></trkpt><trkpt lat="51.686420" lon="14.600861"><ele>106.36</ele><time>2012-06-20T07:02:55Z</time></trkpt><trkpt lat="51.686413" lon="14.600852"><ele>102.52</ele><time>2012-06-20T07:03:00Z</time></trkpt></gpx>


    VB.NET-Quellcode

    1. Dim xdoc As XDocument = XDocument.Load("Test.xml")
    2. MsgBox("lat: " & xdoc.<gpx>.<trk>.<trkseg>.<trkpt>.@lat)
    3. MsgBox("lon: " & xdoc.<gpx>.<trk>.<trkseg>.<trkpt>.@lon)
    4. MsgBox("ele: " & xdoc.<gpx>.<trk>.<trkseg>.<trkpt>.<ele>.Value)
    5. MsgBox("time: " & xdoc.<gpx>.<trk>.<trkseg>.<trkpt>.<time>.Value)


    Ich glaube er stört sich irgendwie an "<gpx xmlns="http://www.topografix.com/GPX/1/1" xmlns:gpxx= ...".

    KabelMops schrieb:

    mit meiner vorliegenden
    stimmt was nicht:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    XML-Quellcode

    1. <?xml version="1.0" encoding="UTF-8" standalone="no" ?><gpx xmlns="http://www.topografix.com/GPX/1/1" xmlns:gpxx="http://www.garmin.com/xmlschemas/WaypointExtension/v1" xmlns:gpxtrx="http://www.garmin.com/xmlschemas/GpxExtensions/v3" xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1" creator="Oregon 550" version="1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/WaypointExtension/v1 http://www8.garmin.com/xmlschemas/WaypointExtensionv1.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd"><trk><name>Day 20-JUN-12 09:02:49</name><extensions><gpxtrx:TrackExtension><gpxtrx:DisplayColor>DarkRed</gpxtrx:DisplayColor></gpxtrx:TrackExtension></extensions><trkseg><trkpt lat="51.686424" lon="14.600851"><ele>107.32</ele><time>2012-06-20T07:02:49Z</time></trkpt><trkpt lat="51.686420" lon="14.600861"><ele>106.36</ele><time>2012-06-20T07:02:55Z</time></trkpt><trkpt lat="51.686413" lon="14.600852"><ele>102.52</ele><time>2012-06-20T07:03:00Z</time></trkpt></trkseg></trk></gpx>


    Deine Fehlermeldung ist richtig. Da es sich hierbei nur um einen kleinen Auszug aus der XML handelt hatte ich das Endtag </gpx> hinzugefügt ohne die anderen Endtags (</trkseg></trk>) mit zu berücksichtigen.
    eigentlich sollte Intellisense dir die richtige Syntax und die verfügbaren Properties anzeigen: Xml verarbeiten mit Intellisense (Schema und XDocument)

    achso - das Dokument hat offsichtlich eine ganz annere Struktur als was du in post#1 postest.
    Dann kann man natürlich garnix weiter aussagen, ausser: "Vermeiden Sie, Fehler zu machen". :P
    Wollte die xml auf das Wesentliche reduzieren.
    Wie schon geschrieben, wenn ich eine ganz einfache XML nehme funktioniert auch alles.
    Hab das mal zur besseren Übersicht hier ein bisschen aufgetrennt:

    XML-Quellcode

    1. <?xml version="1.0" encoding="UTF-8" standalone="no" ?>
    2. <gpx xmlns="http://www.topografix.com/GPX/1/1"
    3. xmlns:gpxx="http://www.garmin.com/xmlschemas/WaypointExtension/v1"
    4. xmlns:gpxtrx="http://www.garmin.com/xmlschemas/GpxExtensions/v3"
    5. xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1"
    6. creator="Oregon 550"
    7. version="1.1"
    8. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    9. xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/WaypointExtension/v1 http://www8.garmin.com/xmlschemas/WaypointExtensionv1.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd">
    10. <metadata>
    11. <link href="http://www.garmin.com">
    12. <text>Garmin International</text>
    13. </link>
    14. <time>2012-06-21T05:33:15Z</time>
    15. </metadata>
    16. <trk>
    17. <name>Day 20-JUN-12 09:02:49</name>
    18. <extensions>
    19. <gpxtrx:TrackExtension>
    20. <gpxtrx:DisplayColor>DarkRed</gpxtrx:DisplayColor>
    21. </gpxtrx:TrackExtension>
    22. </extensions>
    23. <trkseg>
    24. <trkpt lat="51.686424" lon="14.600851">
    25. <ele>107.32</ele>
    26. <time>2012-06-20T07:02:49Z</time>
    27. </trkpt>
    28. <trkpt lat="51.686420" lon="14.600861">
    29. <ele>106.36</ele>
    30. <time>2012-06-20T07:02:55Z</time>
    31. </trkpt>
    32. <trkpt lat="51.686413" lon="14.600852">
    33. <ele>102.52</ele>
    34. <time>2012-06-20T07:03:00Z</time>
    35. </trkpt>
    36. </trkseg>
    37. </trk>
    38. </gpx>


    Kann es vielleicht an die zusätzlichen Namespace wie xmlns:xsi ; xmlns:gpxtpx ; xmlns:gpxtrx ; ... liegen,
    dass er die Subnodes vom Element gpx nicht auslesen kann?

    VB.NET-Quellcode

    1. Dim xdoc As XDocument = XDocument.Load("Test.xml")
    2. Dim ElementListe As List(Of XElement) = xdoc.<gpx>.Elements.ToList
    jepp - das liegt anne Namespaces.
    Studiere mal genau das Tut.
    Und es scheint ein produkiv-Xml zu sein, da kannst du die Schema-Datei evtl. tatsächlich über die Namespace-Uri downloaden.

    Weil im Tut wird ja gezeigt, wie man sich ein Schema selber bastelt - aber das ist natürlich völlig unzureichend - das Schema, was der richtige Xml-Emittent bereitstellt, ist viel differenzierter, und eben auch der Masstab.

    Thunderbolt schrieb:

    Das geht auch bequem per Designer, wenn man dem Projekt ein XML-Schema hinzufügt.


    JA sowas habe ich auch schon gelesen, blos hinbekommen habe ich das auf diese Weise noch nie. Vielleicht beschreibst Du den Vorgang mal so, dass man ihn nachvollziehen kann?
    Mit der XSD.EXE geht das im Übrigen auch wirklich ganz einfach, ist gut beschrieben und das Tool wirft auch hilfreiche Fehler aus, wenn die XML-Datei nicht wirklich "sauber" ist.
    @Dksksm
    Schau dir mal den Beitrag 9 von ErfinderDesRades an, funktioniert soweit ganz gut.
    eigentlich sollte Intellisense dir die richtige Syntax und die verfügbaren Properties anzeigen: Xml verarbeiten mit Intellisense (Schema und XDocument)


    Da es sich in meinem Fall nicht um eine einzelne XML-Datei handelt (Fremddaten),
    muss mein Programm auch mit "unsauberen" XML-Daten zurecht kommen.

    Zur Not müsste ich auf einen StreamReader zurück greifen und die Daten entsprechend meiner Vorstellungen auslesen/auswerten.