Alternative zu XML Parsen: StringRegExpReplace möglich ?

  • Hallo zusammen,

    ich habe folgende Frage, bzw. Ihre Meinung ist sehr gefragt.

    Ich habe ein XML. Dort möchte ich eine bestimmte Values ändern. Nun gibt es natürlich mehrere Möglichkeiten Werte zu ändern: z.B. mit Notepad++, mit XML-Editor direkt, etc.

    Da es zum einen mehreren Werte geändert werden müssen und zum anderen gleichzeitig mehreren XML's bearbeiten werden sollen möchte ich nun mit AutoIt es realisieren.

    Ich habe mir folgenden Ablauf vorgestellt:

    XML auslesen mit Hilfe FileRead als String. Dann auf die Suche kommen mit StringRegExpReplace. Schliesslich neue bearbeitende Datei als neu anlegen.

    " ...

    name="Mustername_zur_Suche" quantity="Mustername_zur_Suche">

    <values>

    <value>123456789.000</value>

    </values>

    "
    Also in jedem XML sollte die Möglichkeit geben durch:

    Code
    Local $sSuchbegrenzung = 'Mustername_zur_Suche(*?)</value>'
    Local $sOutput = StringRegExpReplace($s_Inhalt_aus_XML, $sSuchbegrenzung, "1111.000")

    Nun mache ich wahrscheinlich Fehler, da mein Script keine Ergebnisse zurück liefert.

    Bitte um die Unterstützung!

    Danke im voraus

    VG

    Sascha

  • In deinem Pattern hast du den Punkt für alle Zeichen vergessen.

    Code
    Local $sSuchbegrenzung = 'Mustername_zur_Suche(.*?)</value>'

    Das nächste Mal bitte ein komplett funktionierendes Beispiel posten;)

  • Hallo Tweaky,

    danke für Deine Rückmeldng.

    Irgendwie mache ich immer noch ein Fehler.

    Ich poste nun komplette Script mit XML als Beispiel.

    Geänder sollen nur die Werte in Feld-Value.

    und XML, da es nicht anhängenbar ;(

    Danke und Gruß

  • Reguläre Ausdrücke und XML sind zwei Sachen die so direkt nicht zusammengehören.
    Der verschachtelte Aufbau von XML widerspricht im Grundzug dem seriellen Konzept von Regulären Ausdrücken.
    Sprich: Es ist verdammt schwierig XML vernünftig mit RegEx abzubilden.

    Also: Ja du kannst es mit StringRegExp machen - aber intuitiv und stabil wird es eher kaum werden.

    Aber es gibt ja genug Alternativen.
    Eine gibt uns Microsoft mit Windows gleich mit - so dass man dein Problem folgendermaßen lösen kann:

    Einmal editiert, zuletzt von AspirinJunkie (22. Oktober 2017 um 19:29)

  • Hallo zusammen!

    Ich habe folgenden Beispiel als Zwischenlösung, aber ich denke es sollte doch die Möglichkeit mit Regulären Ausdrücken auch geben.

  • Was hast du mit den ganzen FileSetPos genau vor?
    So wie sie jetzt dastehen können sie problemlos aus dem Code entfernt werden.

    Ansonsten: Hast du meinen Hinweis gelesen? - besonders den Teil mit dem XML-Objekt?
    Falls ja - was stört dich an dieser Lösung?

  • Hallo AspirinJunkie!

    Eine Frage noch.

    Wenn ich ein andere Struktur hätte, wie sollte dann es aussehen?


    alt:

    neu:

    Code
    <book Vorname="Eva" Nachname="Corets" publish_date="2000-11-17" description="After the collapse of ..." name="Book3" id="bk103">
                        <values>
                                <value>99999.000</value>
                        </values>
                    </book>

    Die Lösung für neue Struktur:

    $o_XML.SelectSingleNode('//book[Nachname="Corets"]/values/value').text = "1234.00"

    funktioniert nicht.

    Danke im voraus!

    Gruß

  • Da müsstest du dich mal bisschen in XPath einlesen: >>XPath Tutorial<<

    Dann wäre mein Vorschlag folgender:

    AutoIt
    $o_XML.SelectSingleNode('//book[@Vorname="Eva" and @Nachname="Corets"]/values/value').text = "12345.678"

    Um ganz sicher zu gehen dass du das erste Element <value> bekommst würde man den Index [1]setzen. Im Standardfall ist dies aber beim XMLDOM-Objekt abweichend vom Standard [0].

    Daher kann man am Anfang einmal $o_XML.setProperty("SelectionLanguage","XPath") setzen und nun funktioniert auch folgendes als Selektor:
    '//book[@Vorname="Eva" and @Nachname="Corets"]/values[1]/value[1]'