Am Verzweifeln, XML Value Ändern

  • VB.NET
  • .NET (FX) 4.0

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von xX-Nick-Xx.

    Am Verzweifeln, XML Value Ändern

    Guten abend zusammen, Ich bin so langsam am verzweifeln...

    Ich möchte bei "Animals_cow" das FillLevel vom Water ändern

    nur das Problem ist das es mehrfach OnCreateLoadedObjects gibt...

    mein Problem ist jetzt wie komm ich 1. bei den Animals_Cows rein und 2. ändere ich das FillLevel vom Water?

    XML:
    Spoiler anzeigen

    XML-Quellcode

    1. <careerVehicles>
    2. </onCreateLoadedObject>
    3. <onCreateLoadedObject saveId="Animals_sheep" numAnimals0="0" numAnimals1="0" newAnimalPercentage="0" cleanlinessFactor="1" dirtToDrop="0" palletSpawnerFillDelta="0">
    4. <tipTriggerFillLevel fillType="grass_windrow" tipTriggerIndex="1" fillLevel="0" />
    5. <tipTriggerFillLevel fillType="water" tipTriggerIndex="2" fillLevel="0" />
    6. <tipTriggerFillLevel fillType="dryGrass_windrow" tipTriggerIndex="1" fillLevel="0" />
    7. </onCreateLoadedObject>
    8. <onCreateLoadedObject saveId="Animals_cow" numAnimals0="0" numAnimals1="0" newAnimalPercentage="0" cleanlinessFactor="1" dirtToDrop="0" manureToDrop="0" manureFillLevel="0" liquidManureFillLevel="0">
    9. <tipTriggerFillLevel fillType="straw" tipTriggerIndex="3" fillLevel="0" />
    10. <tipTriggerFillLevel fillType="silage" tipTriggerIndex="1" fillLevel="0" />
    11. <tipTriggerFillLevel fillType="silage" tipTriggerIndex="2" fillLevel="0" />
    12. <tipTriggerFillLevel fillType="powerFood" tipTriggerIndex="1" fillLevel="0" />
    13. <tipTriggerFillLevel fillType="powerFood" tipTriggerIndex="2" fillLevel="0" />
    14. <tipTriggerFillLevel fillType="dryGrass_windrow" tipTriggerIndex="1" fillLevel="0" />
    15. <tipTriggerFillLevel fillType="dryGrass_windrow" tipTriggerIndex="2" fillLevel="0" />
    16. <tipTriggerFillLevel fillType="water" tipTriggerIndex="4" fillLevel="0" />
    17. <tipTriggerFillLevel fillType="grass_windrow" tipTriggerIndex="1" fillLevel="0" />
    18. <tipTriggerFillLevel fillType="grass_windrow" tipTriggerIndex="2" fillLevel="0" />
    19. <fillLevelMilk fillLevel="0" />
    20. </onCreateLoadedObject>


    Freue mich über hilfe da ich so langsam verzweifle...
    Danke! <X :saint:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „xX-Nick-Xx“ ()

    @xX-Nick-Xx
    1. machst Du um Deinen Code einen Spoiler.
    2. Nutze den XML-Format-Button, der ist ganz rechts (die sind nach dem Alphabet sortiert).
    3. Du kannst nicht in ieiner Zeile iwas ändern, wenn es richtig gehen soll, musst Du Das ganze XML-Dokument einlesen, Dich bis zu Deinem Knoten durchhangeln, den Knoten ändern und dann die ganze XML wieder speichern.
      XML-Knoten mit gleicher Signatur und ja/nein unterschiedlichem Inhalt heißen Siblings, da kommst Du mit .NextSibling zum nächsten.
    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!

    xX-Nick-Xx schrieb:

    Ich möchte bei "Animals_cow" das FillLevel vom Water ändern
    Was ist denn dein bisheriger Code?
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell

    VB.NET-Quellcode

    1. For Each book In From element In Xml.<careerVehicles>.<onCreateLoadedObject>
    2. If book.@saveId = "Animals_pig" Then
    3. book.@numAnimals0 = num_pig_pig0.Value.ToString
    4. MsgBox(book.@numAnimals0)
    5. book.SetAttributeValue(book.@numAnimals0, num_pig_pig0.Value.ToString)
    6. End If
    7. Next


    Nur da passiert irgendwie garnix, nicht mal nen fehler


    Ich möchte bei "Animals_cow" das FillLevel vom Water ändern

    Dafür reichen die Grundlagen der Stringbearbeitung. :P

    Hier ein Consolen-Programm:
    (Die Debug.Print Ausgaben dienen nur zur Info)

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.IO
    3. Imports System.Text
    4. Module Module1
    5. Sub Main()
    6. Dim Pfad As String = "d:\##\animal.xml" '<--- anpassen
    7. Dim tmp As String = File.ReadAllText(Pfad)
    8. Dim p1, p2 As Integer
    9. Dim fl As String
    10. p1 = tmp.IndexOf("Animals_cow")
    11. If p1 > 0 Then
    12. Debug.Print(p1)
    13. p2 = tmp.IndexOf("water", p1)
    14. Debug.Print(p2)
    15. If p2 > p1 Then
    16. p1 = tmp.IndexOf("fillLevel", p2)
    17. If p1 > p2 Then
    18. Debug.Print(p1)
    19. p2 = tmp.IndexOf(" />", p1)
    20. Debug.Print(p2)
    21. fl = tmp.Substring(p1 + 11, p2 - p1 - 12)
    22. Debug.Print("fl: " & fl)
    23. End If
    24. End If
    25. End If
    26. If p1 < 0 OrElse p2 < 0 Then
    27. Debug.Print("Nicht gefunden")
    28. 'oder MessageBox-Ausgabe
    29. End If
    30. 'fillLevel ändern
    31. fl = "999" 'als String!!
    32. tmp = tmp.Substring(0, p1 + 11) & fl & tmp.Substring(p2 - 1)
    33. 'und in Datei schreiben
    34. ' File.WriteAllText(Pfad, tmp)
    35. 'Vorsichtshalber erstmal unter anderem Namen speichern.
    36. Dim TestPfad As String = "d:\##\animal-neu.xml"
    37. File.WriteAllText(TestPfad, tmp)
    38. End Sub
    39. End Module

    @xX-Nick-Xx Editiere Deinen Startpost, wie ich es in Post #2 beschrieben habe!
    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!

    RodFromGermany schrieb:

    @xX-Nick-Xx Editiere Deinen Startpost, wie ich es in Post #2 beschrieben habe!

    Wenn ichn Spoiler drauß machen will kommt nur : Ihre Nachricht ist zu lang. Es stehen maximal 50.000 Zeichen zur Verfügung.
    und
    ​Nutze den XML-Format-Button, der ist ganz rechts (die sind nach dem Alphabet sortiert).
    hab ich ned gefunden

    xX-Nick-Xx schrieb:

    Es stehen maximal 50.000 Zeichen zur Verfügung.
    Dann musst Du den Code sinnvoll teilen.
    Wenn ich den Code in eine Datei packe, zst die 49.832 Bytes lang.
    Wenn ich folgende Schritte ausführe:
    • Code in die Zwischenablage kopieren,
    • Spoiler klicken,
    • XML-Tag klicken,
    • Zwischenablage einfügen,
    funktioniert das alles bestens.
    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!
    @xX-Nick-Xx Willst Du Dir hier "illegale" Spielvorteile verschaffen :?:
    Wenn Du das mit nem Programm machen willst, müssten wir davon ausgehen, dass Du das regelmäßig machen willst.
    Wenn Du das nur ein Mal machen willst, nimm Notepad++.
    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!
    @xX-Nick-Xx

    Schieb die xml in einen List(Of Strings) rein und suche dann nach .StartsWith(" <onCreateLoadedObject saveId=""Animals_cow""". Benutz die .split Funktion und splitte bei jedem Anführungszeichen. Benutz dafür .Split(Chr(34)), da du Anführungszeichen meines Wissens nicht escapen kannst. In deinem Fall wäre dann "Split(4)" deine Variable. Ändere die um und setz die Splits wieder zusammen. Wie du das machst, weiß ich leider nicht.

    Hier sind schöne Beispiele: dotnetperls.com/split-vbnet
    Und hier auch nochmal: msdn.microsoft.com/en-us/library/6x627e5f(v=vs.90).aspx

    Ich würde dir ja gerne einen Code zusammenstellen, nur bin ich grade zu müde und würde es dir nur unverständlich reinkleistern. Wenn du bis morgen warten kannst, erstelle ich dir einen Code.

    Ob es die beste Lösung ist, weiß ich nicht. Ich vermute mal, bei meinem Wissen, gibt es eindeutig schnellere Möglichkeiten. Wenn z.B "Animals_cow" immer = 0 ist, kannst du einfach den ganzen String in eine Variable hauen und "<onCreateLoadedObject saveId="Animals_cow" numAnimals0="0"" mit "<onCreateLoadedObject saveId="Animals_cow" numAnimals0="WUNSCHZAHL"" replacen.


    Nehm dir das aber nicht als super Antwort Nummer 1, sowas kann ziemlich in die Hose gehen. Ich denke aber, dass die Splitfunktion dein Freund in dem Fall ist.
    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.