String aus XML rausholen

  • Hallo Leute!

    nachdem heute wieder Telefonterror war, bin ich irgendwie nicht auf die glorreiche Idee gekommen, wie das geht:

    ich habe folgende Zeile aus einer XML-Datei
    <OPCODES><OPCODE><Name>SOF</NAME><PRG>tuwas.bat</PROG><Status>A</Status></OPCODE><OPCODE><Name>SOX</NAME><PRG>justdoit.exe</PROG><Status>S</Status></OPCODE></OPCODES>

    (hier mal so als Muster) und brauche als Antwort nur den TAG und den Status dazu
    SOF A
    SOX S

    eigentlich nur die gesperrten Opcodes (also Status S) das Zeug steht wirklich in einer Zeile drin!!

    soll ich daß in mehrere Zeilen zerlegen also z.B. das /OPCODE durch einen Zeilenumbruch ersetzen??? (das in einer temporären Datei)????

    was besseres ist mir beim heimfahren von der Arbeit nicht eingefallen??

    bring ich die Zeile in ein oder mehrere arrays rein???

    PLEASE HELP

    Grüsse

    German
    schaff den XML code hier nicht rein, in der zeile das kleine x durch KLEINERALS und as X durch GRÖSSERALS ersetzen!!

    • Offizieller Beitrag

    Hallo!

    Es sollte mit RegEx gehen, denke ich. Ist zwar etwas komplizierter, aber wenn man es kann dafür auch relativ einfach und auf jeden Fall sicher.

    Edit: In AutoIt heißt die Funktion dazu StringRegExp. Hier im Forum gibt es schon ein paar Beispielanwendungen, einfach mal suchen...

    peethebee

    • Offizieller Beitrag

    Hi,

    ungefähr so:

    [autoit]

    $string =" <OPCODES><OPCODE><Name>SOF</NAME><PRG>tuwas.bat</PROG><Status>A</Status></OPCODE><OPCODE><Name>SOX</NAME><PRG>justdoit.exe</PROG><Status>S</Status></OPCODE></OPCODES>"

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

    $blah = _SRE_Between($string, '<Status>', '</Status>', 1)

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

    If IsArray($blah) Then
    For $i = 0 To UBound($blah) - 1
    MsgBox(0, '', $blah[$i])
    Next
    Else
    MsgBox(0, '', $blah)
    EndIf

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

    Func _SRE_Between($s_String, $s_Start, $s_End, $i_ReturnArray = 0); $i_ReturnArray returns an array of all found if it = 1, otherwise default returns first found
    $a_Array = StringRegExp($s_String, '(?:' & $s_Start & ')(.*?)(?:' & $s_End & ')', 3)
    If Not @error And Not $i_ReturnArray And IsArray($a_Array) Then Return $a_Array[0]
    If IsArray($a_Array) Then Return $a_Array
    EndFunc

    [/autoit]

    So long,

    Mega

  • hi,

    das geht auch mit xPath und Msxml. Eltorro aus dem englischen Forum hat da eine UDF zu gebaut:
    http://www.autoitscript.com/forum/index.php?showtopic=19848&hl=xml#

    EDIT:
    Beispiel hinzufüg ...

    [autoit]


    #include <array.au3>
    $xmlDoc=ObjCreate("Msxml2.DOMDocument.3.0")
    $xmlDoc.async="false"
    $xmlDoc.load("tab.xml")
    $nodeCollection = $xmlDoc.selectNodes("/OPCODES/OPCODE[STATUS='S']/NAME")
    Dim $aElements[$nodeCollection.length]
    For $i=0 To $nodeCollection.length -1
    $aElements[$i]=$nodeCollection.item($i).text
    Next
    _ArrayDisplay($aElements,"xPathResult")

    [/autoit]

    ... und hier noch die XML etwas aufgebessert ;)

    <?xml version = "1.0" encoding = "utf-8"?>
    <OPCODES>
    <OPCODE>
    <NAME>SOF</NAME>
    <PROG>tuwas.bat</PROG>
    <STATUS>A</STATUS>
    </OPCODE>
    <OPCODE>
    <NAME>SOX</NAME>
    <PROG>justdoit.exe</PROG>
    <STATUS>S</STATUS>
    </OPCODE>
    </OPCODES>

    Einmal editiert, zuletzt von jonk (20. Oktober 2006 um 11:14)

  • hab heute die Lösung von MEGA eingebaut, wäre sehr dankbar, wenn irgendjemand noch ein paar Lesehinweise zu den RegExp hätte (da steig ich noch nicht so ganz durch und bekomm noch graue Haare)

    Grüße

    German
    PS: wie stell ich das Thema jetzt von OFFEN auf ERLEDIGT??

    • Offizieller Beitrag

    Hallo!

    Das Thema habe ich auf gelöst gestellt.
    Ich werde versuchen demnächst mal ein Tutorial zu RegExp zu schreiben, da das doch ständig gefragt wird. Bis dahin folgende Tipps: Forensuche

    [Edit: Ab hier Sche**e gelabert ;) Sorry. War zu SQL, das wird auch so oft gefragt... https://autoit.de/www.sqlzoo.net, Wikipedia -> SQL, Google-Suche "SQL"...]

    peethebee