xml/txt wird nicht komplett ausgelesen

  • Hallo zusammen,

    ich möchte mit meinem kleinen Script aus einer XML die Einträge "Bytes" auslesen.

    Ich bekomme auch einen Teil zurück aber nicht alles.
    Es sind ca. 7000 Einträge die er auslesen soll, aber in dem Array werden mir immer nur 470 ausgegeben.
    Das Pattern muss also stimmen von StringRegExp. Nur warum findet er nicht alles?


    Den Inhalt der XML habe ich in eine txt gepackt und hier Angehängt.


    [autoit]


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

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

    Local $Result = 0

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

    $xml_file = FileRead("c:\temp\test.xml")

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

    $aRegExp = StringRegExp($xml_file, '<segment bytes="(.*?)" number="\d">.*', 3)
    _ArrayDisplay($aRegExp)

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

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

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

    $Result += $aRegExp[$i]

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

    Next

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

    MsgBox(0, "", $Result /1024)

    [/autoit]

    Danke für Eure Hilfe
    Gruß Norman

  • Vielen Dank. :thumbup:
    Oh man ich muss mehr mit StringRegExp arbeiten. 2 Änderungen machen den Unterschied.

    Ähhmmm.... Für den Lerneffekt :D
    Kannst Du mir das mit dem + hinter \d erklären?
    In der Hilfe zu + steht "
    Wiederholt die bisherigen Zeichen, Sets oder Gruppen mindestens einmal. Äquivalent zu {1,}"

    Was genau wird da wiederholt wie kann ich mir das vorstellen?
    Das .*? hat jetzt keinen Unterschied gemacht. Wieso ?

    Danke und Gruß
    Norman

    Einmal editiert, zuletzt von Norman Bates (15. August 2014 um 13:50)

  • Wenn \d eine Ziffer ist dann ist \d+ eine Folge von mindestens einer Ziffer, also einfach gesagt eine Zahl.

    .*? hat denke ich keinen Unterschied gemacht, da die Einträge in einzelnen Zeilen stehen, und Zeilenumbrüche werden von . nicht erkannt.
    Der Unterschied wäre folgendes:
    <test>(.*)</test> | <test>A</test><test>B</test>
    <test>(.*?)</test> | <test>A</test><test>B</test>
    D.h. .* findet soviel wie möglich, .*? nicht.

  • DANKE :thumbup:

    Sorry noch eine kurze Frage....

    Hat .*? genau die gleiche Wirkung wie (.*?).
    Weil (.*?) hatte ich ja vorher schon in meinem Script und dann hast Du gesagt ich soll .*? anstatt von .* benutzen. Das hat mich ein bissel verwirrt.

    2 Mal editiert, zuletzt von Norman Bates (15. August 2014 um 14:19)

  • Hat .*? genau die gleiche Wirkung wie (.*?).


    Ja. Die Klammern bedeuten, das es eine Capture Group ist und man diese dann referenzieren kann (Backreference, sehr nützlich für das Ersetzen von Text.)

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski