XML nach bestimmten String Parsen und in Array schreiben

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • XML nach bestimmten String Parsen und in Array schreiben

    Hallo Leute,

    ich versuche eine XML Datei zu durchsuchen, auf einen bestimmten String.
    Anhand dieses regulären Ausdrucks:
    PHP-Code:
    $tag '/time=".*"/'
    Jetzt wollte ich eigentlich erreichen, dass er mit immer den String "time="0"" in den array schreibt und das hald für jeden passenden wert. Sprich er sollte letztlich dann so aussehen:
    PHP-Code:
    Array
    (
        [
    0] => time="0"
        
    [1] => time="2"
        
    [2] => time="3"

    Aber irgenwie gibt er es mir so aus????
    PHP-Code:
    Array
    (
        [
    0] => time="0">{sdfgsdfg}{sdfgsdfgtime="2">{asdf}{asdftime="3">{asdf}{sdf}
    Es wurden 3 Vorkommen von /time=".*"gefunden 
    Weis allerdings nicht wieso?

    Könnt ihr mir da weiterhelfen? Irgendwie seh ich nicht was da falsch sein soll?

    Danke für eure Hilfe.

    hier das skript:
    PHP-Code:
    $tag '/time=".*"/';
    $inhalt file_get_contents('test.xml');
    preg_match_all($tag,$inhalt,$treffer);

    echo 
    "<pre>";
    print_r($treffer[0]);
    echo 
    "</pre>";

    echo 
    '<p>Es wurden '.count($treffer[0]).' Vorkommen von '.$tag.' gefunden'
    die XML DATEI:
    PHP-Code:
    <?xml version="1.0" encoding="utf-8" ?>

    <DataItems>
        <DataItem TYPEID="{sdfgsdfgsdfgsdfg}" now="10/6/2008 09:33:57" time="0">
            <Event>
                <InstanceID>{sdfgsdfg}</InstanceID>
                <ProviderID>{sdfgsdfg}</ProviderID>
                <Time TimeString="9/21/2008 22:53:01">39712.870162037</Time>
                <SourceName>Security</SourceName>
                <AgentComputer>sdfgs</AgentComputer>
                <Computer>sdfg</Computer>
                <Domain>sdfg</Domain>
                <CategoryNumber>2</CategoryNumber>
                <EventNumber>552</EventNumber>
                <EventType>8</EventType>
                <UserName>sdfgsdfg</UserName>
                <UserDomain>NT AUTHORITY</UserDomain>
                <Message><![CDATA[Logon attempt using explicit credentials:
     Logged on user:
         User Name:    sdfgsdfg
         Domain:        sdfgs
         Logon ID:        (0x0,0x3E7)
         Logon GUID:    {sdfgsdfg}
     User whose credentials were used:
         Target User Name:    sdfg
         Target Domain:    sdfgsdfg
         Target Logon GUID: -

     Target Server Name:    sdfgsdfg
     Target Server Info:    sdfgssdfg
     Caller Process ID:    4345345
     Source Network Address:    -
     Source Port:    -
     ]]></Message>
                <Category><![CDATA[Logon/Logoff ]]></Category>
                <MessageDLL>MsAuditE.dll</MessageDLL>
            </Event>
        </DataItem>
        <DataItem TYPEID="{asdfasd}" now="10/6/2008 09:33:57" time="2">
            <Event>
                <InstanceID>{asdf}</InstanceID>
                <ProviderID>{asdf}</ProviderID>
                <Time TimeString="9/21/2008 22:58:02">39712.8736342593</Time>
                <SourceName>Security</SourceName>
                <AgentComputer>asdf</AgentComputer>
                <Computer>asdf</Computer>
                <Domain>asdfasdf</Domain>
                <CategoryNumber>2</CategoryNumber>
                <EventNumber>552</EventNumber>
                <EventType>8</EventType>
                <UserName>asdf</UserName>
                <UserDomain>NT AUTHORITY</UserDomain>
                <Message><![CDATA[Logon attempt using explicit credentials:
     Logged on user:
         User Name:    asdf
         Domain:        asdf
         Logon ID:        (0x0,sdf)
         Logon GUID:    {asdf}
     User whose credentials were used:
         Target User Name:    asdf
         Target Domain:    asdf
         Target Logon GUID: -

     Target Server Name:    asdf
     Target Server Info:    sdf
     Caller Process ID:    836
     Source Network Address:    -
     Source Port:    -
     ]]></Message>
                <Category><![CDATA[Logon/Logoff ]]></Category>
                <MessageDLL>MsAuditE.dll</MessageDLL>
            </Event>
        </DataItem>
        <DataItem TYPEID="{38D93882-6459-11D2-A6E1-00A0C97148B7}" now="10/6/2008 09:33:58" time="3">
            <Event>
                <InstanceID>{asdf}</InstanceID>
                <ProviderID>{sdf}</ProviderID>
                <Time TimeString="9/26/2008 00:10:47">39716.9241666667</Time>
                <SourceName>asdf</SourceName>
                <AgentComputer>asdf</AgentComputer>
                <Computer>asdf</Computer>
                <Domain>asdf</Domain>
                <CategoryNumber>2</CategoryNumber>
                <EventNumber>22062</EventNumber>
                <EventType>4</EventType>
                <UserName>NETWORK SERVICE</UserName>
                <UserDomain>NT AUTHORITY</UserDomain>
                <Message><![CDATA[The Agent outgoing data processing has successfully resumed after being blocked. 
    Management Group: asdf ]]></Message>
                <Category><![CDATA[MOM asdf ]]></Category>
                <MessageDLL>MOMMsgs.dll</MessageDLL>
            </Event>
        </DataItem>
    </DataItems>

  • #2
    Schau dir mal print_r($treffer) an.

    Kommentar


    • #3
      Original geschrieben von onemorenerd
      Schau dir mal print_r($treffer) an.

      Hmm wird so angezeigt:
      [PHP]
      Array
      (
      [0] => Array
      (
      [0] => time="0">{sdfgsdfg}{sdfgsdfg} time="2">{asdf}{asdf} time="3">{asdf}{sdf}
      [PHP]

      Überseh ich da grad was?

      Kommentar


      • #4
        Schau dir mal den Quelltext der Ausgabe von print_r($treffer) an.
        Bei mir funktioniert dein oben geposteter Code wie erwartet. Bei dir ist offenbar noch der Modifier U (ungreedy) notwendig.

        Kommentar


        • #5
          AHHH GEil das war schon! Krass.

          Hab das im PHP Resource Tutorial nicht gefunden! ;-)
          Link zu Tutorial

          Vielen Dank für deine Hilfe!

          Schöne Grüße
          Michael

          P.S. ich hab jetzt mal gesucht was "ungreedy" wirklich macht, werde aber da nicht wirklich schlau?
          Kann mir das jemand kurz erklären?

          PHP-Code:
          Dieser Modifikator kehrt die Gier von Quantifikatoren umsodass sie 
          standardmäßig nicht gierig sind
          aber gierig werdenwenn ihnen ein "?" 
          folgtDas ist nicht mit Perl kompatibelEs kann auch innerhalb des 
          Suchmusters mit dem Modifikator 
          (?Uoder durch ein Fragezeichen hinter 
          dem Quantifikator 
          (z.B. .*?) gesetzt werden
          Zuletzt geändert von Morpheus2100; 09.10.2008, 12:15.

          Kommentar


          • #6
            Beispiel:

            <b>Das</b> ist ein <b>Test</b>

            Wenn mann nun die B-Tags parsen würde, erhältst du folgendes Ergebnis:

            Ohne Ungready:
            Das</b> ist ein <b>Test

            Mit Ungreadsy:
            Das - und - Test

            Kommentar


            • #7
              Ahha naja das ist ja schonmal was!

              Was mir jetzt aber aufgefallen ist es sollte letzlich ein 2 gig Text Log file geparst werden, was mit php wohl nicht so der performance hit wird.
              Hat jemand schonmal sowas gemacht mit PHP?

              Hab mir das gleiche in perl nochmal geschrieben!

              Vielen Dank für eure Hilfe!

              Kommentar


              • #8
                Es heißt übrigens (un)greedy. Nur falls du mit der Schreibweise beim googlen Probleme hast ...
                [FONT="Helvetica"]twitter.com/unset[/FONT]

                Shitstorm Podcast – Wöchentliches Auskotzen

                Kommentar

                Lädt...
                X