XML-Element Value auslesen returnt ""

  • VB.NET
  • .NET 4.0

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von J.Herbrich.

    XML-Element Value auslesen returnt ""

    Hallo!

    Meine Anwendung muss eine Xml-Datei auslesen. Da ich noch nicht gelernt habe, wie man so etwas macht, habe ich im Internet (u.A stackoverflow) gesucht, aber keine "Lösung" konnte mir wirklich helfen.
    Das eine Mal kriege ich eine Objektinstanz -Exception und das andere Mal erhalte ich den Value "".
    Auch die ofizielle Dokumentation von Microsoft hat mir nicht weiterverholfen.

    Hier mein Code:

    VB.NET-Quellcode

    1. Dim i As BookInfo
    2. Document.Load(path & "/meta.xml")
    3. i.Title = Document.Element("data").Element("title").Value

    Und so sieht ein Beispiel der zu lesenden Datei aus (die xml-Dateien haben immer den selben Aufbau):

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    2. <data>
    3. <title>Wieso?</title>
    4. <description>Darum!</description>
    5. <author>Eine Person</author>
    6. <genre>Horror</genre>
    7. <publisher>dtv</publisher>
    8. <recommendedage>0</recommendedage>
    9. </data>

    Könnte mir jemand erklären, wie man das macht oder im besten Falle sogar ein Beispiel geben?
    Oder besser gesagt, was ich falsch gemacht habe?


    MfG,
    C8002.
    “If debugging is the process of removing software bugs, then programming must be the process of putting them in.”
    -Unbekannt
    @Drahuverar
    "BookInfo" ist eine eigene Structure, die ich für mein derzeitiges Projekt benötige.
    Plus, danke für den Link, den werd' ich mir mal angucken!
    EDIT 1:
    Nein, der Link hat auch nicht geholfen. Ich erhalte die Exception "Der Wert darf nicht NULL sein." oder wider nur den Wert "".
    “If debugging is the process of removing software bugs, then programming must be the process of putting them in.”
    -Unbekannt

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

    Also, würde generell die XML anders machen.
    Ich nehme mal an du willst eine Film-Verwaltung machen?
    Dann gib den Dingern mal 'ne ID.
    So kannst du später auch super leicht Änderungen machen, bei den jeweiligen Filmchen.

    C8002 schrieb:

    die xml-Dateien haben immer den selben Aufbau


    Oder immer nur eine Datei pro?

    Option Strict On!
    @Drahuverar
    'Bin mir ziemlich sicher, dass "Book" übersetzt "Buch" heißt. 8o
    Ich mache einen kleinen eBook-Reader, mit dem man auch eBooks schreiben und in einem eigenen Format speichern kann.
    Dabei ist die "meta.xml" die Datei, die die ganzen Informationen zu einem jeweiligen Buch beinhaltet. (Also 1 Buch pro XML)
    Um die Bücher aber in einer Bibliothek richtig anzeigen kann, brauche ich die Infos aus der "meta.xml"...
    “If debugging is the process of removing software bugs, then programming must be the process of putting them in.”
    -Unbekannt
    Eij,guddi. Dann weiß ich das nun auch.
    Viele kopieren irgendwas und wissen nicht was sie machen, hätte ja sein können das du das irgendwo bei Stackoverflow aufgeschnappt hast und so nutzen wolltest.

    Hiermit bekomm ich z.B. den Titel ;)

    VB.NET-Quellcode

    1. Dim xelement As XElement = XElement.Load("..\..\XMLFile1.xml") 'Deine XML
    2. Dim elmiwant As XElement = xelement.Element("title") 'hier springen wir auf unseren Knoten, data wird nicht beachtet, da wir diesen als Einstiegspunkt nehmen
    3. Dim elmtostring As String = elmiwant.Value 'Noch in einen String speichern..
    4. MessageBox.Show(elmtostring)


    Edit:
    @ErfinderDesRades
    Danke. Hab es weg gemacht, macht keinen Sinn ein String nochmal zu einem String zu konvertieren. XElement.Value ist ja ein String... :love:
    (War ein Überbleibsel von 'vorher')

    Grüße
    Option Strict On!

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Drahuverar“ ()

    Hab den Code mal getestet... und ich erhalte eine leere MsgBox...
    Könnte das an der Xml liegen? Ich generiere sie so:
    Spoiler anzeigen


    VB.NET-Quellcode

    1. Public Function GenerateMeta(ByVal i As BookInfo, Optional ByVal savepath As String = Nothing)
    2. savepath = My.Computer.FileSystem.SpecialDirectories.CurrentUserApplicationData & "/elWizard/books/unfinished/"
    3. IO.Directory.CreateDirectory(My.Computer.FileSystem.SpecialDirectories.CurrentUserApplicationData & "/elWizard/books/unfinished/" & i.Title & "/")
    4. Dim Writer As New XmlTextWriter(My.Computer.FileSystem.SpecialDirectories.CurrentUserApplicationData & "/elWizard/books/unfinished/" & i.Title & "/meta.xml", Text.Encoding.UTF8)
    5. Writer.WriteStartDocument(True)
    6. Writer.Formatting = Formatting.Indented
    7. Writer.Indentation = 2
    8. Writer.WriteStartElement("data")
    9. Writer.WriteStartElement("title")
    10. Writer.WriteString(i.Title)
    11. Writer.WriteEndElement()
    12. Writer.WriteStartElement("description")
    13. Writer.WriteString(i.Description)
    14. Writer.WriteEndElement()
    15. Writer.WriteStartElement("author")
    16. Writer.WriteString(i.Author)
    17. Writer.WriteEndElement()
    18. Writer.WriteStartElement("genre")
    19. Writer.WriteString(i.Genre)
    20. Writer.WriteEndElement()
    21. Writer.WriteStartElement("publisher")
    22. Writer.WriteString(i.Publisher)
    23. Writer.WriteEndElement()
    24. Writer.WriteStartElement("recommendedage")
    25. Writer.WriteString(i.RecommendedAge.ToString)
    26. Writer.WriteEndElement()
    27. Writer.WriteEndElement()
    28. Writer.WriteEndDocument()
    29. Writer.Close()
    30. i.Cover.Save(My.Computer.FileSystem.SpecialDirectories.CurrentUserApplicationData & "/elWizard/books/unfinished/" & i.Title & "/" & i.Title & "_coverA23.png")
    31. End Function


    “If debugging is the process of removing software bugs, then programming must be the process of putting them in.”
    -Unbekannt
    @ErfinderDesRades
    Stimmt. Und ich habe auch die Lösung gefunden. Die Funktion, mit der ich das aufrufe, returnt nichts. *facepalm*
    Noch schnell ein "Return i" drangesetzt und jetzt gehts.
    Trotzdem danke an @Drahuverar sowie @ErfinderDesRades!
    “If debugging is the process of removing software bugs, then programming must be the process of putting them in.”
    -Unbekannt
    Warum lädt man ein Xelement wen man eigentlich besser ein Xdocument laden sollte? Ansonsten ist dass Laden von XML mit Xdocument ja ganz leicht.

    Wen das Xdocument Declariert und geladen ist kann man ja einfach mit MyXdocument.<root-node>.<book>.Value die Sachen auslesen. Und mehrere Sachen auf einmal geht man einfach mit MyXdocument.<root-node>.<arrayOrList>.elements() durch (for each nicht vergessen^^) und dann hat sich's doch.

    Mit einen Xdocument kann man aber auch gnenau so toll auch XML-Filles erstellen.

    LG, J.Herbrich
    Kommt drauf an wie man es machen möchte. Da wir hier nur <data> haben, und nichts weiter, finde ich das XElement super ist.
    Wir sind ja eben direkt drinne dadurch und können <title>,<description>,etc.. somit direkt ausgeben lassen.

    Wäre die XML etwas aufwendiger mit mehreren Knoten, ist XDocument am besten. (Sofern ich es richtig verstanden habe)
    Option Strict On!
    Hallo,

    Ja, mit der Serialisierung währe es Perfekt, nur da muss man halt eben eine Klasse anlegen was die Programmierung in Perfektion darstellen würde.

    Ich Serialisiere und Deserialisiere immer am Liebsten JSON Klassen weswegen ich für mich Persönlich auch immer Serilaisierung vorzihe.

    LG, J.Herbrich
    ich hab einfach mal im SourceCodeAustausch nach "Serialize" gesucht:
    Generischer Code damit sich eine Klasse selbst serialisieren und deserialisieren kann (damit sinds nicht mehr 3 Zeilen, sondern nurnoch eine)

    aber andere haben sich auch damit beschäftigt
    Easy Serializer
    ListView Inhalt - Speichern bzw. Laden

    und google dürfte auch msdn-codesamples erbringen
    Ich habe nur verstanden er hat eine XML Datei die Book Info heißt und eine Klasse mit der er die XML,s Laden will.

    LG, J Herbrich