XML Knoten neu anordnen

  • VB.NET

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

    XML Knoten neu anordnen

    Hallo Leute,

    Ich habe ein XML Dokument bei dem man per Programm einträge hinzufügen kann

    Das ist ungefähr so aufgebaut:

    XML-Quellcode

    1. <Main> <Config> <Activated>True</Activated> <Autostart>False</Autostart> </Config>
    2. <Keys> <Key1> <Key>H</Key> <Shell>ping vb-paradise.de</Shell> </Key1>
    3. <Key2> <Key>S</Key>
    4. <Shell>explorer.exe</Shell> </Key2>
    5. <Key3>
    6. <Key>I</Key> <Shell>iexplorer.exe</Shell> </Key3><Keys>
    7. </Main>



    Wenn ich jetzt einen Eintrag hinzufüge wird automatisch die Zahl um 1 erhöht also in dem Fall "Key4"

    das Problem ist: wenn ich jetzt z.B. "Key2" Lösche ist die Anordnung:
    Key1
    Key3
    Key4

    wenn das so bleiben würde würde das Programm nicht funktionieren.

    Jetzt will ich wissen wie ich das nach jedem gelöschten Eintrag neu anordnen ?
    also das es von 1 beginnt und nach oben zählt:

    Key1
    Key2
    Key3

    Mfg. <-
    Dein
    Das ist ungefähr so aufgebaut:

    -Dokument sollte schon ein xml-Dokument sein. Öffne die xml-Datei mit dem Explorer (oder so) und sieh Dir an, was der dazu sagt. Wenn Du dann alle Fehler behohen hast, solltest Du ein Dokument haben, mit dem Dein Programm (zumindest besser) umgehen kann.
    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).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich habe den Inhalt des xml-Tage ion die Zwischenablage kopiert, mit eine leere Datei "new.xml" angelegt und den Inhalt der Zwischenablage in diese Datei eingefügt. Datei gespeichert und per Drag und Drop auf einen leeren Firefox-Tab gezogen, da kam:

    XML-Verarbeitungsfehler: Nicht übereinstimmendes Tag. Erwartet: </Keys>.
    Adresse: file:///C:/Temp/CTT/new.xml
    Zeile Nr. 8, Spalte 3:
    </Main>
    --^
    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).
    Programmierfragen über PN / Konversation werden ignoriert!
    ahoi,

    nach <key3> fehlt das endtag für <keys> da steht nur das starttag

    ich denke mal du wirst die gesamte datei mit der neuen anordnung neu schreiben müssen
    also was mir auf anhieb einfallen würde, wäre die anordnung per schleife zu durchlaufen und die
    keys größer als der gelöschte key um 1 vermindern
    Grüße Manu

    Was Gott dem Menschen erspart hat, kann der Computer.
    Billy ©, (*1932), Schweizer Aphoristiker
    Quelle: www.Aphorismen.de
    Einfacher ist es, Du hast eine Liste der mit Deinen Tags kommunizierenden Objekten.
    Das Programm editiert, fügt hinzu oder löscht Objekte Deiner Liste, beim Speichern werden die Tags dann einfach numeriert. Und beim nächsten Einlesen so vorhanden ohne Ansehen der Nummer angelegt, oder Du verwendest die Nummer nur dazu, Doppelbelegungen zu verhindern.
    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).
    Programmierfragen über PN / Konversation werden ignoriert!
    naja ich verwende die nummern damit sie durchlaufen werden und in ein listview geladen werden.
    mir wäre das eigentlich egal wie man das macht von mir aus auch ohne nummer, also das man die Knoten nicht über die nummern im Knotennamen anspricht sondern per Index das müsste ja auch gehen oder ?
    Klar. Du kannst Dich durch den xml-Baum durchiterieren, hier musst Du Dir einfach den nächsten Sibling holen.
    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).
    Programmierfragen über PN / Konversation werden ignoriert!
    Aktueller Knoten sei <Key1>
    Dann ist <Keys> das Parent (raus),
    <Key> das 1. Child (rein)
    und <Key2> das Next Sibling (runter).
    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).
    Programmierfragen über PN / Konversation werden ignoriert!
    Kannst Du natürlich.
    Du musst nur den Index vom Inhalt Deines xml-Files entkoppeln:
    doc.<Main>.<Keys>.Index(0) wäre das erste
    doc.<Main>.<Keys>.Index(1) wäre das zweite
    doc.<Main>.<Keys>.Index(6) wäre das dritte
    doc.<Main>.<Keys>.Index(18) wäre das vierte
    usw.
    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).
    Programmierfragen über PN / Konversation werden ignoriert!
    Dann musst Du halt Dein Programm so bauen, dass es das genau so macht. :D
    Und wenn Du was gemacht hast, sende bei Problemen mal ein paar Codeschnipsel, dann sehen wir weiter.
    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).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hm. ?(
    Überleg Dir erst mal, was genau Du willst.
    Nicht "Das geht aber nicht so ...",
    sondern "Das sollte so und so funktionieren ...".
    Dann überlegst Du Dir, wie der Ablauf sein muss, um ein Programm genau so funktionieren zu lassen.
    Und dann fängst Du an. Mache zuerst ein "Grobkonzept", fülle nicht gleich zu Anfang alle Routinen bis ins Kleinste aus, sondern schreib vielleicht nur einen Kommentar hin, was da passieren soll. Wenn irgend etwas nicht klappt, mach Dir einen Dummy-Ersatz (setze eine Variable genau so, wie Du denkst, dass sie nach einem Dialogaufruf sein müsste.
    Usw.
    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).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich weis was ich will und und zwar:

    Die einzelnen XML Knoten über den Index ansprechen
    das funktioniert auch ... teilweise..
    ich versteh nicht wieso es nicht komplett funktioniert:

    Hier die XML datei bei Pastebin hochgeladen: pastebin.com/yVhb4Hxn

    Mein Problem ist:
    Wenn ich das so Anspreche -> Dann geht er zu den Inhalten aber ich möchte das: "KeyA", "KeyB" und so ausgespuckt haben -.-

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim doc As XDocument = XDocument.Load("test.xml")
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. For i = 0 To doc.<Main>.<Keys>.Nodes.Count - 1
    5. MsgBox(doc.<Main>.<Keys>(i))
    6. Next
    7. End Sub
    8. End Class


    In der Msgbox kommt: "Aexplorer.exeBexplorer.exeCexplorer.exe"

    Wieso klappt das nicht ?


    Und ich habe das gleiche mit diesem Msgboxinhalt versucht:

    Msgbox(doc.<Main>.<Keys>.Nodes(i))

    Hier das ergebnis:
    "Aexplorer.exe"
    "Bexplorer.exe"
    "Cexplorer.exe"

    also dank der for schleife 3 Msgboxen mit dem text...

    ich versteh aber nich wieso er den inhalt nimmt und nicht das "KeyA", "KeyB", "KeyC"
    das wäre das was ich benötige...


    Mfg. <-
    Ich denke mal, dann macht

    VB.NET-Quellcode

    1. doc.<Main>.<Keys>(i)

    nicht das, was Du willst.
    Sieh Dir mal doc im Bebugger an.
    Vielleicht solltest Du das xml-Modell wechseln (da kann ich Dir leider nicht die VB.NET-Namen sagen, unter QT heißt das DOM-Modell).
    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).
    Programmierfragen über PN / Konversation werden ignoriert!