Neuen Datensatz zu XML-Datei hinzufügen

  • VB.NET
  • .NET (FX) 4.0

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

    Neuen Datensatz zu XML-Datei hinzufügen

    Hallo,
    vorab - ich habe so gut wie keine Ahnung :(, aber irgendwie habe ich bis jetzt doch alles hinbekommen, aber hier scheitere ich seit Stunden.
    Das ganze ist für einen kleinen Prüfstand, wo ein paar Daten via COM-Port aus den Geräten ausgelesen und Kalibrierdaten, Seriennummer etc geschrieben werden.
    XML-Datei anlegen, öffnen, lesen usw. klappt alles

    Beispiel:
    <?xml version="1.0" encoding="utf-8" ?>
    <Personen>
    <Person>
    <Vorname>Manfred</Vorname>
    <Zuname>Fischer</Zuname>
    <Alter>45</Alter>
    <Ort>Berlin</Ort>
    </Person>
    </Personen>

    Dann soll ein Datensatz <Person> </Person> hinzugefügt werden, dass es so aussieht:

    <?xml version="1.0" encoding="utf-8" ?>
    <Personen>
    <Person>
    <Vorname>Manfred</Vorname>
    <Zuname>Fischer</Zuname>
    <Alter>45</Alter>
    <Ort>Berlin</Ort>
    </Person>
    <Person>
    <Vorname>Otto</Vorname>
    <Zuname>Mustermann</Zuname>
    <Alter>50</Alter>
    <Ort>Frankfurt<Ort>
    </Person>
    </Personen>

    Das kann doch eigentlich nicht schwer sein?

    PS: ich habs auch schon hinbekommen, den Kram als string einzulesen, den ende-tag zu entfernen, meine Daten an das stringende zu schreiben und zu speichern. Klappt auch, aber irgendwie ist das Computer zu Fuss.
    Xml-Tutorial

    Wesentlich eleganter ist Xml verarbeiten mit Intellisense (Schema und XDocument)

    Aber da muss man die richtigen Bibliotheken einbinden, xmlns-Importe richtig angeben, womöglich ein xmlSchema generieren und so Zeugs, wo man lauter kleine Fehler machen kann, und dann funztes nicht und man ist frustriert.
    Dankeschön, habe zwar noch nichts verstanden, aber werde mich mal durchackern...
    Meine Grundidee war ein passendes XElement zu erstellen:
    Dim xmlTree As XElement =
    <Person>
    <Vorname>Otto</Vorname>
    <Zuname>Mustermann</Zuname>
    <Alter>50</Alter>
    <Ort>Berlin</Ort>
    </Person>

    und das mit .Add an die mit XDocument.load geöffnete Datei irgendwie anzuhängen und wieder zu speichern.
    Aber das ist wohl zu einfach gedacht :(
    Vielleicht lasse ich doch meine zusammengebastelte Routine? Funktioniert jedenfalls, gefällt mir trotzdem nicht so recht.
    nee, deine Grundidee ist völlig korrekt - was tritt da bei dir für ein Fehler auf?
    Dafür ist das 2. Tut. Das beschäftigt sich mit XElement etc..
    Man kann dabei aufs XmlSchema auch verzichten - dann hat man halt kein Intellisense.
    Aber gehen tut das:

    VB.NET-Quellcode

    1. Imports System.Xml.Linq
    2. Module Tests
    3. Private _XPersons As XDocument = _
    4. <?xml version="1.0" encoding="UTF-8"?>
    5. <Personen>
    6. <Person>
    7. <Vorname>Manfred</Vorname>
    8. <Zuname>Fischer</Zuname>
    9. <Alter>45</Alter>
    10. <Ort>Berlin</Ort>
    11. </Person>
    12. <Person>
    13. <Vorname>Otto</Vorname>
    14. <Zuname>Mustermann</Zuname>
    15. <Alter>50</Alter>
    16. <Ort>Frankfurt</Ort>
    17. </Person>
    18. </Personen>
    19. Private _XPersons2 As XElement = _
    20. <Personen>
    21. <Person>
    22. <Vorname>Manfred</Vorname>
    23. <Zuname>Fischer</Zuname>
    24. <Alter>45</Alter>
    25. <Ort>Berlin</Ort>
    26. </Person>
    27. <Person>
    28. <Vorname>Otto</Vorname>
    29. <Zuname>Mustermann</Zuname>
    30. <Alter>50</Alter>
    31. <Ort>Frankfurt</Ort>
    32. </Person>
    33. </Personen>

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

    Dim Test = XDocument.Load("Doku.xml")
    Test.Add(xmlTree) <-

    "Ein Ausnahmefehler des Typs "System.InvalidOperationException" ist in System.Xml.Linq.dll aufgetreten.
    Zusätzliche Informationen: Durch diesen Vorgang würde ein falsch strukturiertes Dokument entstehen."
    jo, ist richtig, was die Fehlermeldung sagt. Einem XDocument kann man auf oberster Ebene keine Elemente zufügen, weil Xml grundsätzlich immer nur ein einziges Root-Element hat.
    vlt. guckste doch auch das Basic-Tut an, da wird auch drauf eingegangen, wie Xml aufgebaut ist.

    Probier so:

    VB.NET-Quellcode

    1. _XDoc.Root.Add(xmlTree)


    Nochn Tipp: Verwende die Formatierungs-Buttons des Forums - gugge
    also das .root hat mehr oder weniger alle Probleme gelöst :thumbsup:
    Eine kleine Sache noch:

    VB.NET-Quellcode

    1. Private Sub WriteDoku()
    2. Dim NewRecord As XElement =
    3. <Ladedruckregler>
    4. </Ladedruckregler>
    5. NewRecord.Add(New XElement("Seriennummer", SerienNummer))
    6. NewRecord.Add(New XElement("Software", SoftwareVersion))
    7. NewRecord.Add(New XElement("Datum", DateString))
    8. NewRecord.Add(New XElement("Zeit", TimeString))
    9. 'usw
    10. Doku.Root.Add(NewRecord)
    11. Doku.Save(DokuFile)
    12. End Sub

    Die Seriennummer hätte ich gerne als Attribut, soll dann so aussehen:

    <Ladedruckregler Seriennummer="120">
    .
    .
    </Ladedruckregler>

    Wäre es eine Konstante wäre es ja schon fertig. Soll aber nätürlich eine Vaiable sein.

    Auf jeden Fall schon mal dickes Dankeschön für die bisherige Hilfe.
    supi, auch das klappt - damit bin ich jetzt fertig mit der Sache.
    Alles funktioniert wie es soll und ich bin froh, es doch mit den dafür vorgesehenen Sachen gelöst zu haben. Am Ende viel einfacher und sauberer ist als meine vorherige Bastelei, aber der Zeitaufwand war schon erheblich. Dafür weiss ich jetzt, wie ich es beim nächsten Mal gleich mache.