tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
1
ZUGRIFFE
750
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    tryanderror tryanderror ist offline Mitglied
    Registriert seit
    Feb 2005
    Beiträge
    20
    Als erstes ich hab so gut wie kein Plan von PHP.
    Hab so ziemlich alles gelesen was hier zu XML zu finden ist, komme jetzt aber nicht mehr weiter.

    Ich habe ein Verzeichnis auf dem Server in dem sich die XML Dateien befinden. Aus diesen XML Dateien benötige ich jedoch nur einzelne Einträge. Es würde mir reichen diese in ein Array zu schreiben und dann als Website ausgeben zu können.
    Soweit so gut.

    Ich hab es mit dem Code probiert:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    
     <?php
    [color=red]$file = "1127518465.xml";[/color]
    $xml_parser = xml_parser_create();
    if (!($fp = fopen($file, "r"))) {
    die("could not open XML input");
    }
    $data = fread($fp, filesize($file));
    fclose($fp);
    xml_parse_into_struct($xml_parser, $data, $vals, $index);
    xml_parser_free($xml_parser);
    $params = array();
    $level = array();
    foreach ($vals as $xml_elem) {
    if ($xml_elem['type'] == 'open') {
    if (array_key_exists('attributes',$xml_elem)) {
         list($level[$xml_elem['level']],$extra) = array_values($xml_elem['attributes']);
    } else {
         $level[$xml_elem['level']] = $xml_elem['tag'];
    }
    }
    if ($xml_elem['type'] == 'complete') {
    $start_level = 1;
    $php_stmt = '$params';
    while($start_level < $xml_elem['level']) {
         $php_stmt .= '[$level['.$start_level.']]';
         $start_level++;
    }
    $php_stmt .= '[$xml_elem[\'tag\']] = $xml_elem[\'value\'];';
    eval($php_stmt);
    }
    }
    echo "<pre>";
    print_r ($params);
    print_r ($level);
    echo "</pre>";
    ?>php

    Funktioniert auch soweit. Nur ich habe in der XML Datei jedoch mehrere Einträge von folgendem:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    
    <Players>
    [color=darkorange]<Player>
    <ID>31</ID>
    <Team>0</Team>
    <Name>blabla</Name>
    <Score>0</Score>
    <Kills>0</Kills>
    <Deaths>0</Deaths>
    <TOP>0</TOP>
    <Ping>1542</Ping>
    <PL>0</PL>
    <Time>1</Time>
    <IP>0.0.0.0</IP>
    <Damage>
    </Damage>
    </Player>[/color]
    [color=green]<Player>
    <ID>1</ID>
    <Team>0</Team>
    <Name>blabla</Name>
    <Score>0</Score>
    <Kills>0</Kills>
    <Deaths>0</Deaths>
    <TOP>0</TOP>
    <Ping>1542</Ping>
    <PL>0</PL>
    <Time>1</Time>
    <IP>0.0.0.0</IP>
    <Damage>
    </Damage>
    </Player>[/color]

    Diese Blöcke wiederholen sich halt bei mehreren Spielern. Die Ausgabe zeigt jedoch nur einen Eintrag.
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    
     
     
     
     
    [PLAYERS] => Array[indent]([indent][PLAYER] => Array
     
     
     
     
     
     
    ([indent][ID] => 1
     
     
    [TEAM] => 1
    [NAME] => test
    [SCORE] => 0
    [KILLS] => 18
    [DEATHS] => 3
    [TOP] => 0
    [PING] => 57
    [PL] => 0
    [TIME] => 5
    [IP] => 0.0.0.0
    [DAMAGE] => 
     
     
    [/indent])
     
     
     
     
    [/indent][/indent])

    Wie bekomme ich jetzt die anderen Player auch noch in die Ausgabe bzw. in das Array?

    Wie kann ich alle Dateien, die sich in dem Verzeichnis befinden, auf einmal auslesen?
    - siehe rot markierte Stelle -

    Vielleicht hat ja jemand einen Codeschnippsel für mich.
     

  2. #2
    tryanderror tryanderror ist offline Mitglied
    Registriert seit
    Feb 2005
    Beiträge
    20
    Ok, hat sich soweit erledigt, habs irgendwie hingebastelt bekommen.
    Sogar auch das mit den Dateinamen und dem auslesen.

    hier meine Lösung

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    
     $file = $dateinamen[$x];
    echo "Dieses ist der" . $x . ". Durchlauf ". $dateinamen[$x] . "<br>";
    $xml_parser = xml_parser_create();
    if (!($fp = fopen($file, "r"))) {
    die("could not open XML input");
    }
    $data = fread($fp, filesize($file));
    fclose($fp);
    $p = xml_parser_create();
    xml_parser_set_option($p, XML_OPTION_CASE_FOLDING, 0);
    xml_parser_set_option($p, XML_OPTION_SKIP_WHITE, 1);
    xml_parse_into_struct($p, $data, $values, $idx);
    xml_parser_free($p);
     
    // tracking used keys
    $usedKeys = array();
    $deepLevel = -1;
    // start a php array string (evaluated later)
    $forEvalPrefix = '$xml_array';
     
    // loop throught the value array
    foreach ($values as $key => $val) {
         $tagName = $val['tag']; // pass the key tag into a more friendly looking variable
         $level = $val['level']; // idem
         if($val['type'] == 'open') {
             $deepLevel++; // increase deep level
             $forEvalPrefix .= '[\''. $tagName .'\']';
     
             // begin used keys checks to allow multidimensionatity under the same tag
             (isset($usedKeys[$level][$tagName])) ? $usedKeys[$level][$tagName]++ : $usedKeys[$level][$tagName] = 0;
             $forEvalPrefix .= '['. $usedKeys[$level][$tagName] .']';
         } 
         if($val['type'] == 'complete') {
             ($level > $deepLevel) ? $deepLevel++ : ''; // increase $deepLevel only if current level is bigger
             $tagValue = addslashes($val['value'] ); // format the value for evaluation as a string
             $forEvalSuffix = '[\''. $tagName .'\'] = \''. $tagValue .'\';'; // create a string to append to the current prefix
             $forEval = $forEvalPrefix . $forEvalSuffix; // (without "$php_used_prefix"...)
             eval($forEval); // write the string to the array structure
         }
         if($val['type'] == 'close') {
             unset($usedKeys[$deepLevel]); // Suppress tagname's keys useless
             $deepLevel--;
             $forEvalPrefix = substr($forEvalPrefix, 0, strrpos($forEvalPrefix, '[')); // cut off the used keys node
             $forEvalPrefix = substr($forEvalPrefix, 0, strrpos($forEvalPrefix, '[')); // cut off the end level of the array string prefix
         }
    }

    Also hat sich erledigt....
     

Ähnliche Themen

  1. In Dateien schreiben und Dateien auslesen (z.B. User + Pwd)
    Von NeoHeadquarter im Forum Visual Basic 6.0
    Antworten: 1
    Letzter Beitrag: 09.05.06, 13:44
  2. Antworten: 18
    Letzter Beitrag: 28.06.05, 00:53
  3. Antworten: 7
    Letzter Beitrag: 08.03.05, 19:44
  4. Antworten: 1
    Letzter Beitrag: 23.06.03, 16:09
  5. [C++]mehrere Dateien
    Von Piesbruhder im Forum C/C++
    Antworten: 4
    Letzter Beitrag: 24.11.02, 17:13