VB.net: Einträge in einer XML-Datei ändern

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    VB.net: Einträge in einer XML-Datei ändern

    Hallo,
    Ich habe eine XML-Datei mit folgendem Format und möchte diese aus dem Code heraus bearbeiten, finde aber keine geeigneten Methoden


    <?xml version="1.0" encoding="UTF-8"?>
    <NewDataSet>

    <FloatParameter>
    <Label>Counter1</Label>
    <GWOG>2000</GWOG>
    <GWUG>0</GWUG>
    <enable></enable>
    </FloatParameter>

    <FloatParameter>
    <Label>Counter2</Label>
    <GWOG></GWOG>
    <GWUG></GWUG>
    <enable></enable>
    </FloatParameter>

    </NewDataSet>

    (sorry, daß die Einzüge verschwinden...)

    Ein Eintrag ist eindeutig durch <Label> unterhalb von <FloatParameter> definiert.

    Ich möchte nun folgendes machen: In dieser existierenden Liste soll z.B. der <GWOG> Wert für „Counter2“ auf „1000“ gesetzt werden. Außerdem soll für„Counter2“ noch eine zusätzliche Zeile <Alarm> eingefügt werden.

    Könnt Ihr mir hier einen guten Ansatz geben. XML-Beispiele die ich bisher gefunden haben mich bisher eher verwirrt als daß sie hilfreich waren.
    Kleine Erklärung zu mir noch hinterher: Mit XML habe ich bisher keinerlei Erfahrung und auch in VB.net bin ich noch weit vom Expertenmodus weg... Daher diese vielleicht einfach aussehende Frage.

    Danke schon mal für eure Hilfe!

    Gruß P..
    Willkommen im Forum.
    Laut den XML-Angaben bearbeitest Du eine DataSet-Datei. Ist Dir das bewusst? Willst Du in VB später mit nem DataSet weiterarbeiten? Denn wenn ja, stellt sich mir die Frage, waum Du das nicht dann auch auf dieser Schiene bearbeiten willst. Da selber in der XML-Datei rumzufuhrwerken, erscheint mir am Ziel vorbei zu gehen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Hi VaporiZed,
    Das mit der DataSet-Datei ist mir nicht bewusst, bin wie gesagt komplett neu in der XML Materie und habe bisher nur diverse Code-Snippets zusammengebaut, bis der Code das getan hat, was ich von ihm will.
    Hast du für mich einen besseren Ansatz oder ein Tutorial?

    Verwendung ist folgende: Zu einzelnen Variablen bzw (E/A-)Felder gibt es eine Reihe Parameter die die Einheit genauer definieren (Grenzen u.Ä.)
    90% werden einmal generiert und nie wieder verändert, eine Veränderung zur Programmlaufzeit soll aber möglich sein (das war meine Frage zu oben.

    Gruß P..
    @Phasenverschiebung Ebenfalls Willkommen im Forum. :thumbup:
    Wo kommen denn diese XML-Dateien her?
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Ich darf vielleicht noch etwas ausholen:

    Es geht letztlich um Bedienoberflächen für Anlagen in denen der Bediener verschiedene Knöpfe, Anzeigen, Zahleneingaben machen kann. Diese Bedienelemente sollen mittels der XML Datei Parametriert werden (Farben, Texte, Variablennamen, Grenzen etc)
    Bisher hatte ich diese Parametrierungen über eine klassische ini-Datei gemacht, was jetzt auf xml umgestellt werden soll.

    zur Datenherkunft: Während der Projektierung werden die Daten in einer Excel-Tabelle definiert.
    Aus dieser Tabelle habe ich dann (quasi von Hand, also nicht über xsd) die xml-Datei generiert (mittels Imports System.Xml,
    Imports Microsoft.Office.Interop und den XmlDocument Methoden)

    Gruß, P..

    Letztlich bin ich in der Strukturierung jetzt aber nicht von Kollegen abhängig, ich könnte die Struktur beliebig anders definieren, wenn das sinnvoll wäre.
    @Phasenverschiebung Sehr gute Beschreibung. :thumbup:
    Das ganze kannst Du programm-intern machen.
    Nimm eine DataTable und binde sie als DataSource an ein DataGridView. Beispiel gugst Du Differenz in Prozent ausrechnen
    Pack das in ein separates Projekt und verstehe es.
    Wenn Du es verstanden hast, wendest Du es auf Dein eigentlichen Projekt an.
    Feddich. ;)
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Ich habe meine Routinen jetzt umgebaut und erweitert: DataGrid verwende ich keins, sondern lese die Variable direkt aus. Auch das Ändern und zurückschreiben funktioniert jetzt prinzpiell.

    Entspricht das so jetzt den gängigen Philosophien?


    Daten lesen und verwenden:

    myDataSet.ReadXml(myXMLfile)
    myDataTableBool = myDataSet.Tables("Boolparameter")
    myDataRow = myDataTableBool(i)
    Text = myDataRow("Text")


    Daten setzen und zurückschreiben
    myDataRow("Text") = „neuer Text“
    myDataSet.WriteXml(myXMLfile)



    noch eine Zusatzfrage:

    Wenn ich eine Table/Sektion “Floatparameter” mit z.B den im Beispiel oben enthaltenen Parametern GWOG, GWUG und enable habe und jetzt für für eine Parametrierung anderer Elemente noch Parameter1-10 zusätzlich brauche, packe ich die dann am besten in eine neue Table/Sektion “Floatparameter_komplex” oder geht es mit DataTables auch, daß nicht jede Node-Definition enthalten sein MUSS?

    Gruß, P..
    @Phasenverschiebung Wenn Du mit an DataTables gebundenen Daten arbeitest, ist die XML-Repräsentation tabu für Dich.
    Wenn da was zu ändern ist, ändere die DataTable.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Ich bin mal so frei.
    Wenn Du mit ner DataTable (DT) und/oder nem DataSet (DS) arbeitest: Finger weg von den XML-Daten. Dafür hast Du doch die tollen Möglichkeiten, die Dir DS und DT bieten.

    Wenn Du nen Parameter einfügst, kannst Du das in der bestehenden DT machen. Dort musst Du nur bei NullValue einen Wert eingeben, der verwendet werden soll, wenn die XML-Daten nix hergeben. Zu Beginn steht da (Throw Exception) drin. Ändere das zu dem Sollwert ab.
    Bilder
    • TdsDesigner.png

      18,38 kB, 797×394, 14 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Ok, dann andersrum: Woher kommen Deine Daten? Bastelst Du Dir die selber oder kommen die aus einem anderen Programm?
    Wenn ersteres, dann nutze die Methoden, die Dir das tDS und die DataTables zur Verfügung stellen. Da gäbe es als allererstes (und m.E. auch als wichtigstes) DeinDataSet.DeineDataTable.AddDeineDataTableRow(WertFürColumn1, WertFürColumn2, ...)
    Wenn Fremddaten: Auch dort gibt es Importmöglichkeiten. Rohdaten zu manipulieren sollte nur in wenigen Fällen nötig sein. Mach ich auch, aber selten, da ich meine XML-Daten alle verschlüsselt in nem Datenbankersatz habe.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    ich versuch es mal zu erklären, klingt eventuell etwas "grob":

    ​bei Programmstart lädst du die XML in das Dataset DS mit deinem Programm. Die Daten sind somit im Speicher/RAM

    ​Zur Programmlaufzeit änderst du die Daten ausschließlich im Dataset DS. Die neuen Daten sind immernoch im Speicher/RAM

    ​Zum Programmende oder zu bestimmten Zeitpunkten oder bei jeder Usereingabe oder was auch immer speicherst du die Daten aus dem Dataset DS in einer XML-Datei. Die neuen Daten sind immernoch im Speicher/RAM und auch auf der Festplatte.

    ​Zu keinem Zeitpunkt hast du selbst irgendwas mit XML zu tun. Du musst weder verstehn wie man es schreibt, oder in die Datei reingucken oder da mit dem Programm drin rumpuhlen. Deine Anwendung weiß wie man XML in Dataset übersetzt, wenn die XML auch mit dem Programm hinterlegt wurde. Datasets haben die Methoden ReadXML und WriteXML dafür.
    (Hab ich wohl erfolgreich übersprungen)
    Dann würde ich das an Deiner Stelle wie geschrieben machen: Rohdaten aus der Exceltabelle importieren und dann in die DataTable einfügen. Notfalls als Zwischenschritt über ne csv-Datei, falls der direkte Excel-Transport nach VB zu kompliziert ist. Aber XML-Daten selber schreiben wär in meinen Augen zu umständlich. Du willst ja in nem .Net-Projekt damit weiterarbeiten. Also kann man sie auch dort einpflegen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    @KBP: genau so mach ichs ja.Sorry wenn das missverständlich war. DS aus XML lesen. (Selten vorkommende) Änderungen aus dem Programm in DS ändern und wieder wegspeichern.

    Die Excel-Tabelle selber kann ich nicht verwenden, da sie noch eine Menge anderer Projektierungsdaten enthält, die für die Kollegen bestimmt sind (und die ich auch aus anderen Gründen nicht beim Kunden hinterlegen will.
    cvs hab ich früher gemacht aber jetzt hatte es geheißen: Neue Programm-Generation - probier mal xml, weil man (wer auch immer "man" ist) das heute so macht.

    Ich denke, meine ursprüngliche Frage hat sich erschöpft - es funktioniert jetzt und scheint mir halbwegs sauber.
    Wie Daten ins Programm kommen ist wohl eher eine Philosophie-Frage und ist vermutlich an anderer Stelle zur Beantwortung besser aufgehoben.

    Vielen Dank für eure Hilfe!
    Gruß, P..

    Phasenverschiebung schrieb:

    @KBP:
    Es wäre höflich, die Namen der Mitstreiter ( @KBT ) korrekt zu schreiben.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!