XML Attribut finden, vergleichen und ändern

  • C#

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von MajorOli.

    XML Attribut finden, vergleichen und ändern

    Hallo Community,

    ich habe folgendes Problem:
    in einer XML Datei befinden sich sehr viele Knoten mit Attributen (Stammt aus einen Savegame)
    Nachdem ich die relevanten Knoten ausgelesen und in weiteren Methoden bearbeitet habe, möchte ich das Attribut ändern welches geändert wurde.

    Beispiel:
    Ausschnitt aus der XML-Datei -> Hier geht es um die "node" Knoten.
    Das fillLevel wird geändert. Der geänderte Wert soll dann dem entsprechenden fillType wieder zugeordnet werden.
    Spoiler anzeigen

    XML-Quellcode

    1. <onCreateLoadedObject saveId="AnimatedObject_Door52" animTime="0" direction="0"/>
    2. <onCreateLoadedObject saveId="AnimatedObject_LU_LagerRollDoor4" animTime="0" direction="0"/>
    3. <onCreateLoadedObject saveId="Storage_storage1">
    4. <node fillType="wheat" fillLevel="50" />
    5. <node fillType="barley" fillLevel="10870" />
    6. <node fillType="rape" fillLevel="7108.158203125" />
    7. <node fillType="sunflower" fillLevel="0" />
    8. <node fillType="soybean" fillLevel="0" />
    9. <node fillType="maize" fillLevel="0" />
    10. <node fillType="forage" fillLevel="0" />
    11. <node fillType="forage_mixing" fillLevel="0" />
    12. <node fillType="silage" fillLevel="0" />
    13. <node fillType="powerFood" fillLevel="0" />
    14. <node fillType="dryGrass_windrow" fillLevel="0" />
    15. </onCreateLoadedObject>
    16. <onCreateLoadedObject saveId="AnimatedObject_LU_LagerRollDoor5" animTime="0" direction="0"/>
    17. <onCreateLoadedObject saveId="AnimatedObject_MaschinenhalleSaegewerkdoor2" animTime="1" direction="0"/>



    Mein Ansatz war das ich jeden Knoten über das Attribut fillType vergleiche und dann das fillLevel ändere. Hier dachte ich an einen XMLWriter. Bei diesem Ansatz stehe ich aber auf den Schlauch wie ich den Richtigen Knoten ändere.
    Es muss dann wohl noch einen Ansatz mit LINQ geben. Leider habe ich kaum Wissen über LINQ (wer hier auch ein gutes TUT hat, könnte dies eventuell mal mit posten)

    Mein Ansatz:
    Spoiler anzeigen

    C#-Quellcode

    1. private void AktualisiereSavegame()
    2. {
    3. using (XmlReader XReader = XmlReader.Create(PfadSavegame))
    4. {
    5. while(XReader.ReadToFollowing("node"))
    6. {
    7. if(XReader.GetAttribute("fillType") == "wheat")
    8. {
    9. }
    10. }
    11. }
    12. }



    Merci.
    Hallo zusammen,

    leider konnte ich bisher noch keine Lösung finden bzw. habe ich das bisher noch nicht verstanden, glaube ich.
    Ich habe zwar verstanden wie ich mit Linq werte finden, aber nicht wie ich genau diesen Wert ändere.

    die Aktuelle sieht wie folgt aus:

    C#-Quellcode

    1. private void AktualisiereSavegame()
    2. {
    3. XDocument xmlDocument = XDocument.Load(PfadSavegame);
    4. var returnStrings = from e in xmlDocument.Descendants("node")
    5. where (string)e.Attribute("fillType") == "wheat"
    6. select (string)e.Attribute("fillLevel");
    7. foreach(var element in returnStrings)
    8. {
    9. MessageBox.Show(element);
    10. }
    11. xmlDocument.Save(PfadSavegame);
    12. }


    wie kann ich jetzt diese Werte jetzt mit Linq ändern? Ich hoffe mir kann hier jemand helfen.
    stimmt...
    ich habe aber nun endlich eine Lösung gefunden. Eigentlich ist diese recht simpel.

    Hier die Lösung:

    C#-Quellcode

    1. private void AktualisiereSavegame()
    2. {
    3. XDocument doc = XDocument.Load(PfadSavegame);
    4. foreach (XElement node in doc.Descendants("node")) //alle node-Knoten durchgehen
    5. {
    6. //Abfrage welcher fillType
    7. XAttribute fillType = node.Attribute("fillType");
    8. if (fillType.Value == "wheat")
    9. {
    10. //Setze das fillLevel
    11. XAttribute fillLevel = node.Attribute("fillLevel");
    12. fillLevel.Value = "100";
    13. }
    14. }
    15. doc.Save(PfadSavegame);
    16. }