XML Datei lesen

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von eichseinet.

    XML Datei lesen

    Hallo!

    Von der Galileo-Seite (openbooks) hab ich mir den Code geholt, um eine XML mit Unterelementen zu schreiben. Die Datei wurde dann schön langsam erweitert. Das klappt prima.
    Die Lesefunktion klappt aber nicht. Mein Beispiel ist folgendermaßen aufgebaut (nur ein Auszug, das Wurzelelement wird unten richtig abgeschlossen):


    VB.NET-Quellcode

    1. Sub XML_gezielt_lesen()
    2. Dim xml As New Xml.XmlDocument()
    3. xml.Load(c:\versuchs.xml)
    4. For Hauptelement_Zähler = 0 To xml.DocumentElement.ChildNodes.Count - 1
    5. For Unterelement_Zähler = 0 To xml.DocumentElement.ChildNodes(Hauptelement_Zähler).ChildNodes.Count - 1
    6. MsgBox(xml.DocumentElement.ChildNodes(Hauptelement_Zähler).ChildNodes(Unterelement_Zähler).Value)
    7. Next Unterelement_Zähler
    8. Next Hauptelement_Zähler
    9. End Sub


    Es erscheinen so viele Textboxen wie es Einträge gibt, aber jede ist leer. Warum?
    Das Wurzelelement lässt sich anzeigen, das Ergebnis der Zählung auch. Es existiert also Zugriff auf die Datei. Warum erhalte ich nicht "Text1" usw. in meiner Textbox?

    eddi
    Ich kann dir nur folgenden Code anbieten, weil dein Xml vom png abzuschreiben ist mir zu umständlich.

    VB.NET-Quellcode

    1. Imports System.Xml
    2. Public Class Form2
    3. Dim XDoc As XDocument = _
    4. <?xml version="1.0" encoding="UTF-8"?>
    5. <planetinfos xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="planetinfo.xsd">
    6. <header version="2.6" universe="Jupiter" debug="true" language="german" content_type="planetinfo"/>
    7. <planetinfo playername="xxx" playerid="111111" planetname="Atom" moon="false" galaxy="1" system="2" planet="3">
    8. <entry name="Metal" amount="46026"/>
    9. <entry name="Crystal" amount="46006"/>
    10. <entry name="Deuterium" amount="24340"/>
    11. <entry name="Energy" amount="2495"/>
    12. <entry name="Metal Mine" amount="16"/>
    13. <entry name="Crystal Mine" amount="15"/>
    14. <entry name="Deuterium Synthesizer" amount="10"/>
    15. <entry name="Solar Plant" amount="18"/>
    16. <entry name="Fusion Reactor" amount="7"/>
    17. <entry name="Solar Satellite" amount="0"/>
    18. <entry name="Metal Storage" amount="4"/>
    19. <entry name="Crystal Storage" amount="3"/>
    20. <entry name="Deuterium Tank" amount="2"/>
    21. </planetinfo>
    22. </planetinfos>
    23. Sub XML_gezielt_lesen()
    24. For Each Xel As XElement In XDoc.<planetinfos>(0).<planetinfo>(0).<entry>
    25. MsgBox(Xel.@name & " " & Xel.@amount)
    26. Next
    27. End Sub
    28. End Class
    Mir deiner Lösung kam ich leider nicht weiter.
    Dafür konnte ich herausfinden wo der Fehler im Code von Openbook liegt: man muss noch eine Ebene tiefer zugreifen.

    VB.NET-Quellcode

    1. Sub XML_gezielt_lesen()
    2. 'XML mit Werten als Tag auslesen
    3. Dim xml As New Xml.XmlDocument()
    4. xml.Load(PFAD)
    5. For Hauptelement_Zähler = 0 To xml.DocumentElement.ChildNodes.Count - 1 'hierdurch werden die Haupelemente gezählt, xml.DocumentElement greift immer auf das Wurzelemet zu
    6. For Unterelement_Zähler = 0 To xml.DocumentElement.ChildNodes(Hauptelement_Zähler).ChildNodes.Count - 1 'jetzt werden direkte Unterelemente gezählt, weitere Unterebenen zählt man so nicht, dazu muss dann wieder eine tiefere Ebene aufgerufen und gezählt werden
    7. 'die letzte Childnodes Anweisung muss sein, weil der Text als Kind der Untergruppe gilt,
    8. 'da es hier keine Schachtelung mehr geben kann reicht eine feste 0
    9. MsgBox(xml.DocumentElement.ChildNodes(Hauptelement_Zähler).ChildNodes(Unterelement_Zähler).ChildNodes(0).Value)
    10. Next Unterelement_Zähler 'nächstes Unterelement
    11. Next Hauptelement_Zähler 'nächstes Hauptelement
    12. End Sub


    Damit hat sich das Thema erledigt.

    Gruß

    eddi