Finden verschiedener Tags in einer Datei

  • Hallo Forum.

    Ich stehe vor der Herausforderung gut 6000 XML-Dateien zu untersuchen und die Werte gewisser Tags in eine CSV zu schreiben.
    Diese Tags enthalten Links die ich auflisten muss.

    Ein solcher Tag sieht in etwa so aus:

    Code
    <Tag name="URL_1" xml:lang="de" text="https://www.google.com"/>
    
    
    oder
    
    
    <Tag name="Bild_1" xml:lang="de" text="http://www.blabla.com/picture1.jpg"/>

    Nun kann es aber auch sein, dass diese Tags mehrfach in der selben Datei vorkommen könnten.
    Ich habe versucht die Datei mit FileRead einzulesen und dann mit

    [autoit]

    $URL_1_start = '<Tag name="URL_1" xml:lang="de" text="'
    $URL_1_ende = '"/>'

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

    $URL_1_raw = _StringBetween($file_content, $URL_1_start , $URL_1_ende, -1)

    [/autoit]

    an die Werte zu kommen. Das funktioniert. Aber eben nur für das erste Vorkommen innerhalb der Datei.
    Hat jemand eine Idee, wie ich an alle Werte komme? Ich finde da keinen richtigen Ansatzpunkt.

    Gruß, Matthias

    "Ausdauer wird früher oder später belohnt – meistens aber später" (Wilhelm Busch)

  • Hi,
    wieso nimmst du den gesamten Tag zur Suche?
    Wenn ich das richtig verstanden habe, brauchst du doch nur die Links?

    Spoiler anzeigen
    [autoit]

    #include <String.au3>
    #include <Array.au3>
    $file_content='<Tag name="URL_1" xml:lang="de" text="https://www.google.com"/>' & @crlf & _
    '<Tag name="URL_2" xml:lang="de" text="http://www.autoit.de"/>' & @crlf & _
    '<Tag name="URL_3" xml:lang="de" text="http://www.autoitscript.com"/>'

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

    $URL_start = '" text="'
    $URL_ende = '"/>'
    $URL_raw = _StringBetween($file_content, $URL_start , $URL_ende, -1)

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

    _arraydisplay($URL_raw)

    [/autoit]
  • Ich doof, ich... Klar hab ich ja bei _StringBetween die Werte im Array...
    Okay. Das wäre ja die eine Möglichkeit.

    Gibt es vielleicht noch eine einfachere Möglichkeit die Links zu finden? Also z.B alles was mit "http://" bzw. "https://" beginnt?

    "Ausdauer wird früher oder später belohnt – meistens aber später" (Wilhelm Busch)

  • Also... Ich habe das nun nochmal mit

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

    $URL_start = 'http://'
    $URL_ende = '"/>'

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

    $URL_raw = _StringBetween($file_content, $URL_start , $URL_ende, -1)

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


    versucht. Das geht auch soweit. Allerdings fehlt mir im Array dann die Protokoll-Angabe (also das http://). Gibt es eine Möglichkeit, das wieder in jeden Eintrag des Arrays vorne an zu hängen? Dann würde ich in einem zweiten Durchgang das gleiche noch einmal mit https:// machen und die Arrays dann verbinden.

    Gruß, Matthias

    "Ausdauer wird früher oder später belohnt – meistens aber später" (Wilhelm Busch)


  • Gibt es eine Möglichkeit, das wieder in jeden Eintrag des Arrays vorne an zu hängen? Dann würde ich in einem zweiten Durchgang das gleiche noch einmal mit https:// machen und die Arrays dann verbinden.


    [autoit]


    For $i = 0 To (UBound($URL_raw) - 1)
    $URL_raw[$i] = "http://" & $URL_raw[$i]
    Next

    [/autoit]
  • Ich würde ggf. die Möglichkeit in Betracht ziehen, per RegEx die Links aus beliebigen Textfiles zu extrahieren.

    [autoit]

    #include <Array.au3>
    $file_content='<Tag name="URL_1" xml:lang="de" text="https://www.google.com"/>' & @crlf & _
    '<Tag name="URL_2" xml:lang="de" text="http://www.autoit.de"/>' & @crlf & _
    '<Tag name="URL_3" xml:lang="de" text="http://www.autoitscript.com"/>' & @crlf & _
    '<Tag name="URL_4" xml:lang="de" text="www.blablub.com"/>'

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

    $URL_raw = stringregexp($file_content, '((?:https?:\/\/)?(?:[\da-z\.-]+)\.(?:[a-z\.]{2,6})(?:[\/\w \.-]*)*\/?)', 3)
    _arraydisplay($URL_raw)

    [/autoit]

    Wenn benötigt, kann man auch FTP usw-Links hinzufügen...