RegEx Problem mit XML Struktur

  • Hallo liebe Community,
    Ich beschäftige mich in letzter Zeit viel mit RexEx und bis jetzt hat auch nach einiger Zeit alles so funktioniert wie ich es wollte, nun bin ich aber an meine grenzen gestoßen ^^

    Ich habe folgenden String:

    Spoiler anzeigen
    Code
    <t tn="e36ef284-42f8-4dbf-abab-d4682c609d25" tmk="10"><tis><ti tk="0" tv="Text1" ta="False" /><ti tk="1" tv="Text2" ta="False" /><ti tk="2" tv="Text3" ta="False" /><ti tk="3" tv="Text4" ta="True" /><ti tk="4" tv="Text5" ta="True" /><ti tk="5" tv="Text6" ta="False" /><ti tk="6" tv="Text7" ta="False" /><ti tk="7" tv="Text8" ta="False" /><ti tk="8" tv="Text9" ta="True" /><ti tk="9" tv="Text10" ta="False" /><ti tk="10" tv="Text11" ta="True" /></tis></t>


    Vor dem String können beliebig viele Zeichen stehen, dahinter ebenfalls, diese können aber komplett ignoriert werden.

    Um fürs erste diesen String herauszufinden habe ich folgendes Regex versucht:

    Code
    (?<=<t tn="e36ef284-42f8-4dbf-abab-d4682c609d25" tmk="10">).*(?=</tis></t>)


    aber leider stimmt da wohl etwas noch nicht ganz, da ich kein Ergebnis zurück kriege.

    Ich benötige ein RegEx, mit einer Variablen, je nachdem, welche "id" übergeben wird, die genau dieses Ergebnis zurück liefert, also bei 0 => Text1, 1 => Text2 usw...

    Ich bin für jede Hilfe dankbar

  • wenns vorher und nachher keine tk-tv-Paare gibt kannst du ja direkt den ganzen String entsprechend auswerten:

    Spoiler anzeigen
    [autoit]

    Global Const $s_String = '<t tn="e36ef284-42f8-4dbf-abab-d4682c609d25" tmk="10"><tis><ti tk="0" tv="Text1" ta="False" /><ti tk="1" tv="Text2" ta="False" /><ti tk="2" tv="Text3" ta="False" /><ti tk="3" tv="Text4" ta="True" /><ti tk="4" tv="Text5" ta="True" /><ti tk="5" tv="Text6" ta="False" /><ti tk="6" tv="Text7" ta="False" /><ti tk="7" tv="Text8" ta="False" /><ti tk="8" tv="Text9" ta="True" /><ti tk="9" tv="Text10" ta="False" /><ti tk="10" tv="Text11" ta="True" /></tis></t>'
    Global Const $sPattern = 'tk="(\d+)" tv="([^"]+)"'

    [/autoit] [autoit][/autoit] [autoit]

    For $i in StringRegExp($s_String, $sPattern, 4)
    MsgBox(0,"", "tk: " & $i[1] & @CRLF & _
    "tv: " & $i[2])
    Next

    [/autoit]

    Ansonsten zeig einfach mal den kompletten XML-String.

  • Spoiler anzeigen
    Code
    <cpstruct maxPropID="137"><ts><t tn="9914bafd-2d78-451d-aca3-905ebc3077b6" tmk="3"><tis><<ti tk="1" tv="Nein" ta="True" /><ti tk="2" tv="Vielleicht" ta="True" /><ti tk="3" tv="Sonstiges" ta="True" /></tis></t><t tn="7e3f0209-ce37-4793-a411-b5690e983040" tmk="1"><tis><ti tk="0" tv="Ja" ta="True" /><ti tk="1" tv="Nein" ta="True" /></tis></t><t tn="79b0f3dc-3bf0-4fcf-9fdc-d06016c3ad0e" tmk="3"><tis><ti tk="0" tv="1 Option" ta="True" /><ti tk="1" tv="2 Option" ta="True" /><ti tk="2" tv="3 Option" ta="True" /><ti tk="3" tv="0 Optionen" ta="True" /></tis></t><t tn="e36ef284-42f8-4dbf-abab-d4682c609d25" tmk="10"><tis><ti tk="0" tv="Text1" ta="False" /><ti tk="1" tv="Text2" ta="False" /><ti tk="2" tv="Text3" ta="False" /><ti tk="3" tv="Text4" ta="True" /><ti tk="4" tv="Text5" ta="True" /><ti tk="5" tv="Text6" ta="False" /><ti tk="6" tv="Text7" ta="False" /><ti tk="7" tv="Text8" ta="False" /><ti tk="8" tv="Text9" ta="True" /><ti tk="9" tv="Text10" ta="False" /><ti tk="10" tv="Text11" ta="True" /></tis></t><t tn="31de64f5-dffd-4d4c-8212-2af181cb0fbd" tmk="10"><tis><ti tk="0" tv="BLA" ta="False" /><ti tk="1" tv="BLABLA" ta="False" /><ti tk="2" tv="BLABLA" ta="False" /><ti tk="3" tv="BLA" ta="True" /><ti tk="4" tv="BLA" ta="True" /><ti tk="5" tv="BLA" ta="False" /><ti tk="6" tv="BLA" ta="False" /><ti tk="7" tv="BLA" ta="False" /><ti tk="8" tv="BLA" ta="True" /><ti tk="9" tv="BLA" ta="False" /><ti tk="10" tv="BLA" ta="True" /></tis></t></ts><pds><pd pdid="1" pdn="Nr1" pdtn="st" /><pd pdid="3" pdn="Nr2" pdtn="st" /><pd pdid="5" pdn="Nr3" pdtn="st" /><pd pdid="7" pdn="Nr4" pdtn="st" /><pd pdid="8" pdn="Nr5" pdtn="st" /></pds></cpstruct>

    Anbei der gesamte Beispielstring. Leider kann der String vorher und auch nachher tk-tv Paare enthalten, sowie auch alle anderen Paarungen (tis,t)
    Ich bin jetzt soweit, das ich mit folgendem Regex den Anfang von dem gesuchten String finde:

    Code
    (?<=<t\stn="e36ef284-42f8-4dbf-abab-d4682c609d25"\stmk=".*tk="0"\stv=").*(?=")


    Allerdings wird nicht das " nach dem Text genommen, sondern das letzte im gesamten String.

    • Offizieller Beitrag

    Probier mal so:

    [autoit]

    $s = 'blabla' & @CRLF & _
    'blablablub<t tn="e36ef284-42f8-4dbf-abab-d4682c609d25" tmk="10"><tis><ti tk="0" tv="Text1" ta="False" /><ti tk="1" tv="Text2" ta="False" /><ti tk="2" tv="Text3" ta="False" /><ti tk="3" tv="Text4" ta="True" /><ti tk="4" tv="Text5" ta="True" /><ti tk="5" tv="Text6" ta="False" /><ti tk="6" tv="Text7" ta="False" /><ti tk="7" tv="Text8" ta="False" /><ti tk="8" tv="Text9" ta="True" /><ti tk="9" tv="Text10" ta="False" /><ti tk="10" tv="Text11" ta="True" /></tis></t>xxxxyyyyzzz' & @CRLF & _
    'xxxyyy'
    $aRet = StringRegExp($s, '<t tn="e36ef284-42f8-4dbf-abab-d4682c609d25" tmk="\d+"><tis><ti (.*)(?= /></tis>)', 3)
    ;~ ConsoleWrite($aRet[0] & @CRLF)
    ; liefert:
    $s2 = 'tk="0" tv="Text1" ta="False" /><ti tk="1" tv="Text2" ta="False" /><ti tk="2" tv="Text3" ta="False" /><ti tk="3" tv="Text4" ta="True" /><ti tk="4" tv="Text5" ta="True" /><ti tk="5" tv="Text6" ta="False" /><ti tk="6" tv="Text7" ta="False" /><ti tk="7" tv="Text8" ta="False" /><ti tk="8" tv="Text9" ta="True" /><ti tk="9" tv="Text10" ta="False" /><ti tk="10" tv="Text11" ta="True"'

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ;splitten an " /><ti "
    $aSplit = StringSplit($s2, " /><ti ", 3)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    For $i = 0 To UBound($aSplit) -1
    $sOut = StringTrimLeft($aSplit[$i], 10+StringLen($i))
    $sOut = StringTrimRight(StringLeft($sOut, StringInStr($sOut, '"')), 1)
    ConsoleWrite('Index: ' & $i & ', Wert: ' & $sOut & @CRLF)
    Next

    [/autoit][autoit][/autoit][autoit][/autoit]


    Dann ehältst du die einzelnen Zuweisungen, die sich mit Stringoperationen auslesen lassen. Edit: Habs mal in die Schleife eingefügt.

  • Mit diesem Regex hat es geklappt:

    Code
    (?<=<t\stn="e36ef284-42f8-4dbf-abab-d4682c609d25"\stmk=".*tk="0"\stv=")[^"]*

    Danke für eure Hilfe!