XML auslesen

  • hey danke,

    mit deiner lösung komme ich aber irgendwie nur Bis zum ersten KUnden und dann kommt der Fehler
    "Array variable has incorrect number of subscripts or subscript dimension range exceeded.:"

    steht bei $aCustomers[i$][1] die 1 für den ersten Kunden?
    könnte ich mir bei diesem Array jetzt auch zb nur die Eine Nummer vom Kunden und dann Extra den Kunden dazu ausgeben, falls ich anders mit der Variable arbeiten möchte?

    müsste ich bei "1 to UBound($aCustomers) - 1" nicht eigentlich hochzählen? Ich sage ihm doch das er von 1 bis "Größe des Arrays" zb 10 hochzählen soll aber das -1 würde ihn doch gleich am anfang von 1 auf 0 setzen oder?

    Danke für die hilfe!

    EDIT:
    Okay nun funktioniert es, ist die zweite FOR Schleife nicht überflüssig? Ich habe doch oben die selbe schleife

    [autoit]


    For $i = 1 To UBound($aCustomers) - 1

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

    $aTmp=$aCustomers[$i][1]

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

    For $j = 1 To UBound($aTmp) -1

    [/autoit]

    Dadurch "kopiere" ich doch eigentlich nur das Array
    die 2. und 3. Frage bleiben bestehen

    Einmal editiert, zuletzt von toto2468 (1. Oktober 2013 um 09:38)

  • Zitat

    steht bei $aCustomers[i$][1] die 1 für den ersten Kunden?
    könnte ich mir bei diesem Array jetzt auch zb nur die Eine Nummer vom Kunden und dann Extra den Kunden dazu ausgeben, falls ich anders mit der Variable arbeiten möchte?

    $aCustomers[$i][1] ist die zweite Dimension des Array $aCustomers. In ihr befindet sich ein weiteres Array, das die einzelnen Pfade des Kunden hält. Schau dir mal den Output in der Konsole an. Ich hab das Gefühl, du kannst dir den AUfbau dieses Array nicht wirklich vorstellen.

    Spoiler anzeigen
    [autoit]

    #include <array.au3>
    #include <String.au3>

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

    $sXML = '<video>' & @CRLF & _
    '<Kunde>Klaus</kunde>' & @CRLF & _
    '<Objektnummer>12345</Objektnummer>' & @CRLF & _
    '<Objektnummer>54815</Objektnummer>' & @CRLF & _
    '</video>' & @CRLF & _
    '<video>' & @CRLF & _
    '<Kunde>Fritz</kunde>' & @CRLF & _
    '<Objektnummer>5677879</Objektnummer>' & @CRLF & _
    '</video>' & @CRLF & _
    '<video>' & @CRLF & _
    '<Kunde>Heinz</kunde>' & @CRLF & _
    '<Objektnummer>43567</Objektnummer>' & @CRLF & _
    '<Objektnummer>87234</Objektnummer>' & @CRLF & _
    '</video>' & @CRLF & _
    '<video>' & @CRLF & _
    '<Kunde>Peter</kunde>' & @CRLF & _
    '<Objektnummer>45678</Objektnummer>' & @CRLF & _
    '</video>'

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

    $aResult = StringRegExp($sXML, "<video>(?s)(.*?)</video>", 3, 1)
    ;_ArrayDisplay($aResult)

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

    Dim $aCustomers[1][2]

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

    For $i = 0 To UBound($aResult) - 1
    Dim $aCustomer[1]
    Dim $aPaths[1]
    $aCustomer = _StringBetween($aResult[$i], "<kunde>", "</kunde>")
    ReDim $aCustomers[UBound($aCustomers) + 1][2]
    $aCustomers[UBound($aCustomers) - 1][0] = $aCustomer[0]
    $aObjects = _StringBetween($aResult[$i], "<Objektnummer>", "</Objektnummer>")
    _ArrayConcatenate($aCustomer, $aObjects)
    ;_ArrayDisplay($aCustomer)
    For $j = 1 To UBound($aCustomer) - 1
    _ArrayAdd($aPaths, "/" & $aCustomer[0] & "/" & $aCustomer[$j])
    Next
    ;_ArrayDisplay($aPaths)
    $aCustomers[UBound($aCustomers) - 1][1] = $aPaths
    Next
    $outputMessage = ""
    For $i = 1 To UBound($aCustomers) - 1
    $aTmp = $aCustomers[$i][1]
    $outputMessage &= @CRLF & "[" & $i & "][0] -> " & $aCustomers[$i][0] & @CRLF
    $outputMessage &= "[" & $i & "][1] -> [0]" & @CRLF
    For $j = 1 To UBound($aTmp) - 1
    $outputMessage &= @TAB & "-> [" & $j & '] ' & $aTmp[$j] & @CRLF
    Next
    Next
    ConsoleWrite($outputMessage & @LF)

    [/autoit]


    Damit sollte auch klar werden, warum es zwei inneinander verschachtelte For-Schleifen sind. Die äussere durchläuft die erste Dimension von $aCustomers, die innere holt die dazugehörigen Informationen aus der 2ten Dimension.

    Zugreifen kannst du hier natürlich auch auf einzelne Kunden per _ArraySearch(). Die Kundennamen stehen ja gerade deshalb in der ersten Dimension von $aCustomers. Hast du den Kunden in der ersten DImension gefunden, kannst du an diesem Index natürlich auch die zweite Dimension durchsuchen, um eine bestimmte Nummer bzw. einen bestimmten Pfad zu finden.

    Zitat

    müsste ich bei "1 to UBound($aCustomers) - 1" nicht eigentlich hochzählen? Ich sage ihm doch das er von 1 bis "Größe des Arrays" zb 10 hochzählen soll aber das -1 würde ihn doch gleich am anfang von 1 auf 0 setzen oder?

    $i = 1 To Ubound(...) -1 zählt hoch. Die Zählrichtung und die grösse dr Schritte würde man mit dem "Step" Schlüsselwort bestimmen. Dazu schaust du dir bitte die Hilfe zu For-Schleifen an. UBound() ermittelt die Anzahl der Elemente in einem Array. Da der Index eines Arrays aber bei null beginnt, müssen wir von der Anzahl an Elementen eins abziehen um den Index des letzen Elements zu erhalten. Dazu bitte mal im Array-Tutorial von BugFix nachlesen: http://www.bug-fix.info/array_tut.htm

    Ich hoffe das dir das in irgendeiner Wese hilft. Mein Erklärbärmodus läuft momentan etwas instabil.

  • Hey danke für die Schnelle hilfe, ja mit arrays hatte ich immer schon meine Probleme und bin ja auch nur ein Azubi der Zweckentfremdet wurde hehe.
    Jetzt läuft es, er erstellt mir die richtigen Pfade für die einzelnen Kunden und diese konnte ich auch verarbeiten

    Das array habe ich durch dein letzen Script endlich vom aufbau verstanden :D
    Ich versuche mal auf diese Art eine andere XML einzulesen

    Danke erstmal für die Hilfe

  • Habe nunj die ganze zeit Probiert aber ich komme doch mit meiner anderen XML nicht klar.

    so sieht meine andere XML aus, nun möchte ich mir nacheinander die einzelnen textelemente Ausgeben lassen, da diese später nacheinander in eine Datei geschrieben werden.

    Es gibt pro Objekt eine solche XML.

    Bisher habe ich:

    [autoit]


    $sNamenXML = FileRead('Videos' & $aTmp[$j] & 'content.xml')

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

    $sResult = StringRegExp($sNamenXML, "<Subtitles>(?s)(.*?)</Subtitles>", 3, 1)

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

    Dim $sTextA[1]

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

    For $i = 0 To UBound($sResult) - 1
    Dim $sText[1]

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

    $sText = _StringBetween($sResult[$i], "<text>", "</text>")
    _ArrayDisplay($sText)
    $sTextA[UBound($sTextA) - 1] = $sText[0]
    _ArrayDisplay($sTextA)

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

    ReDim $sTextA[UBound($sTextA) + 1]
    Next
    ReDim $sTextA[UBound($sTextA) - 1]

    [/autoit]

    Da ich dieses mal ja keine zwei Werte habe sondern nur den einen habe ich nur Dim $sTextA[1] gemacht.
    Dann sollte er ja eigentlich meine texte einzeln in $sText schreiben welches er mir ja auch anzeigt. Nun muss ich ja diese EInzelnen werte in ein anderes Array bringen welches ich dann auslesen kann oder?
    Array war noch nie so meine stärke

    Danke im vorraus

    EDIT:

    Okay hat sich erledigt,

    [autoit]

    $sNamenXML = FileRead('Videos' & $aTmp[$j] & 'content.xml')

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

    $sResult = StringRegExp($sNamenXML, "<Subtitles>(?s)(.*?)</Subtitles>", 3, 1)

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

    For $x = 0 To UBound($sResult) - 1
    Dim $sText[1]

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

    $sText = _StringBetween($sResult[$x], "<text>", "</text>")

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

    Next

    [/autoit]

    und dann mit $sText[x] ausgeben :)

    Danke für eure hilfe :)

    Einmal editiert, zuletzt von toto2468 (1. Oktober 2013 um 14:46)