Problem beim Auslesen von xml Datei mit linq to xml

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Jopi-Dev.

    Problem beim Auslesen von xml Datei mit linq to xml

    Also gleich mal vorweg: Ihr habt hier nicht nur einen Visual Basic Einsteiger vor euch sondern auch noch einen absoluten Programmier-Beginner. Seid also bitte gnädig mit mir, ich bin halt noch recht unwissend.
    Ich hab hier ein Problem, wo ich einfach nicht weiter komme. Ich hab schon gegoogelt wie ein Weltmeister, hab das Openbook von Galileo durchsucht, sonstige Literatur ebenso, aber ich finde einfach weder für mich passende Code-Beispiele noch finde ich den Fehler in meinem Code.

    Folgendes Szenario:
    Ich habe eine xml Datei mit folgendem Aufbau: (ist der Fehler vielleicht schon hier? Weil die Datei hab ich mir auch selbst erstellt)

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <indexcheck>
    3. <indexcheckdate>01132005<indexcheckstatus> OK</indexcheckstatus></indexcheckdate>
    4. <indexcheckdate>01142005<indexcheckstatus> OK</indexcheckstatus></indexcheckdate>
    5. ....
    6. </indexcheck>


    Ich will hier nun das indexcheckdate und den indexcheckstatus auslesen und dann weiter verarbeiten.

    Zum Auslesen habe ich mir folgenden Code gebastelt:

    VB.NET-Quellcode

    1. Dim readXML As XDocument = XDocument.Load("d:\indexcheck.xml")
    2. Dim readstring = From indexcheck In readXML.Descendants("")
    3. Select indexcheckdate = indexcheck.Element("indexcheckdate").Value, IndexcheckStatus = indexcheck.Element("indexcheckstatus").Value


    Wobei das einfach nicht funktioniert und wenn ich das debugge, dann seh ich, dass readstring immer Null ist. Ich komm aber einfach nicht drauf, was da jetzt falsch ist. Ich finde wie gesagt einfach auch keinen Beispielcode wo ich mir das absehen könnte, wie ich das machen kann. Ich bin hier mit meinem (nur wirklich marginalst vorhandenen) Latein total am Ende.
    Bitte geht mir nicht an die Gurgel, wenn ich hier ein grobes Verständnisproblem habe, ich bin eben blutiger (wenn auch lernwilliger) Anfänger. Achja, und ich muss noch so richtig unverschämt sein: Bitte haltet die Antworten einfach, damit ich sie auch verstehe :D
    ahoi,

    und deine anwendung startet mit dem code ?
    welche bibliotheken hast du denn eingebunden gerade für Select.

    wenn ich was falsches schreibe sollte man mich auf jedenfall korrigieren
    aber dein xmlfile sieht schon mal komisch aus du könntest erstmal versuchen die zu bereinigen,
    also die form Tag -> wert -> tag -> wert -> endtag -> endtag so wie du das gestaltet hast kennich gar nicht
    nochmal zurverdeutlichung
    die sogenannten tags also die wörter in <> müssen eindeutig sein, du halst also einen tag als mothernode in deinem fall <indexcheck>
    dannach folgen die tags für die childnodes in deinem fall <indexcheckdate> und </indexcheckstatus>
    wie ein xml file aussieht solltest du dir vielleicht nochmal anschauen,

    deien childnodes sollten nochmal unterteilt werden
    da du also mehrere datensätze hast sollte jeder nochmals ein node bekommen und jeder node sollte einen wert zugewiesen bekommen
    Grüße Manu

    Was Gott dem Menschen erspart hat, kann der Computer.
    Billy ©, (*1932), Schweizer Aphoristiker
    Quelle: www.Aphorismen.de
    Aufjedenfall ist deine XML Datei schonmal falsch

    Quellcode

    1. <tag1>wert
    2. <tag2>wert</tag2>
    3. </tag1>


    Sowas geht nicht.

    Ich würde dir so ein Aufbau empfehlen, vorallem mit Attributen arbeiten.

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <indexcheck checkdate="01132005" checkstatus="OK" />
    3. <indexcheck checkdate="01142005" checkstatus="OK" />
    4. ....


    Sowas lässt sich definitiv schöner auslesen. Sicher auch min LinQ, zwar habe ich damit noch nie gearbeitet sondern nutze immer XML Reader.
    @Manu und Dodo: Was die xml Struktur betrifft: Schon mal danke für die Ausführungen. Ich hab vor dem Konzeptionieren des xml-Files versucht herauszufinden ob ich denn nun Attribute oder Elemente nehmen soll, bin aber bei meinen (eigentlich doch recht umfangreichen) Recherchen einfach auf keinen klaren grünen Zweig gekommen, wann man was für was nehmen soll.
    Ich hab mich jetzt nochmal ein wenig eingelesen und bin noch immer nicht recht viel schlauer. Ich hab mir u.a. das hier durchgelesen:
    w3schools.com/dtd/dtd_el_vs_attr.asp Der schreibt ja davon, dass man Attributes eher vermeiden soll. (daher auch meine ursprüngliche Entscheidung das mit Elementen zu machen).
    Frage hierzu: Ich hab ja, wie Dodo das angemerkt hat, die Struktur so gewählt:

    Quellcode

    1. <tag1>wert
    2. <tag2>wert</tag2>
    3. </tag1>


    Mein Gedanke hierbei war, dass Tag1 und Tag2 ja ein zusammengehöriges Pärchen sind.
    Sehe ich das richtig, dass das (mein Schluss ua. anhand eurer Ausführungen) dann z.b. so aussehen sollte?

    XML-Quellcode

    1. <indexcheck>
    2. <indexcheckstatus>
    3. <date="01012010>
    4. <status>OK</status>
    5. </indexcheckstatus>
    6. </indexcheck>


    Alternativ kann ich natürlich den Status auch als Attribute machen bzw. eben beide als Elemente. (Vor- bzw. Nachteile hiervon sind mir leider immer noch nicht klar). Hab ich jetzt die richtige Denkweise?

    @Manü:
    Was den restlichen Code betrifft, das ist natürlich nicht der gesamte Code, ich haben eben nur mal das Codesnippet rausgesucht, wo es meiner Ansicht nach hakte. Ich rufe zu Beginn natürlich

    VB.NET-Quellcode

    1. Imports System.Linq


    auf. Wenn relevant für die Fehlersuche kann ich natürlich auch den Rest reinkopieren. (so wie ich das jetzt einschätze, werd ich da sowieso noch meine Problemchen haben und dann euch erst recht mit dem Code quälen :D ;) ) Danke schonmal und nochmal für eure Geduld :)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „cereal_poster“ ()

    Also was bei w3school steht bezieht sich denke ich mal aufs Web, da W3 ja für WWW steht. In PHP und so lassen sich glaub Attribute schwer auslesen, aber in VB ists relativ easy und ich finde XMLs sind dadurch auch deutlich strukturierter.

    Das man "pärchen" zusammen fasst ist schon korrekt aber nicht so wie du.

    Ich mache es mal anhand eines anderen Beispiels deutlich wie man sowas macht

    XML-Quellcode

    1. <adressbuch>
    2. <personen>
    3. <person>
    4. <name>Max Mustermann</name>
    5. <telefon>0534534563454</telefon>
    6. <stadt>Musterstadt</stadt>
    7. </person>
    8. <person>
    9. <name>Bernd Albrecht</name>
    10. <telefon>67345345</telefon>
    11. <stadt>Bochum</stadt>
    12. </person>
    13. <person>
    14. <name>Frida Müller</name>
    15. <telefon>67547</telefon>
    16. <stadt>Berlin</stadt>
    17. </person>
    18. </personen>
    19. <eigenschaften>
    20. <default>irgendwas</default>
    21. </eigenschaften>
    22. </adressbuch>


    Also hier sieht man die globale Gruppe "adressbuch" hierdrin ist also alles vom Adressbuch. Die nächste untergruppe ist "personen" dort sind nun alle Personen drin, diese werden auch wieder in untergruppen zusammen gefasst nämlich "person". Dort sind alle Infos der einzelnen Personen enthalten.
    Soviel das es vielleicht verstehst wie sowas sinnvoll aufgebaut wird, auf dein Problem bezogen könnte man es OHNE Attribute so aufbauen

    XML-Quellcode

    1. <indexcheck>
    2. <checkstatus>
    3. <date>28.09.2010</date>
    4. <state>OK</state>
    5. </checkstatus>
    6. <checkstatus>
    7. <date>29.09.2010</date>
    8. <state>FAILED</state>
    9. </checkstatus>
    10. </indexcheck>


    verstehste?
    @Dodo: Genau diese Struktur (nur eben mit einem attribute) hatte ich bei meinem Beispiel auch gemeint. Also dass ich unter checkstatus dann die einzelnen checks und dates reingebe. Ich werd das mal bei der Erstellung umbauen (und auch noch das Datum einzeln mit Tag, Monat, Jahr reingeben, weil ich da etwas im Hintergedanken habe, dass ich das xml dann besser nach einer Datumsrange durchsuchen und auswerten kann). Ich denke ich hab das mit der Struktur jetzt so weit behirnt.

    Danke nochmall! Ich melde mich wieder (nein, das ist nicht als Drohung gemeint ;) ) wenn ich das so weit umgebaut und getestet habe.