2010-12-03 5 views
1

La fonction de test suivante lit un fichier XML avec xmlreader de PHP et renvoie un tableau bidimensionnel de 3 valeurs ("id" = clé).PHP xmlreader to array

Comment pouvez-vous éditer le code afin que la clé et la valeur du nom d'utilisateur soient également retournées dans le tableau? (Voir à la fin)

ini_set('always_populate_raw_post_data', 'on'); 

function test() 
{ 
    $request = $HTTP_RAW_POST_DATA; 
    error_reporting(E_ERROR | E_WARNING | E_PARSE); 
    $url = "http://site.xml"; 
    $reader = new XMLReader(); 
    $reader->open($url);; 

    $var = array(); 
    $i = 0; 
    $limit = 3; 

    while ($reader->read()) 
    { 
     if ($reader->name == "id" && $reader->nodeType == XMLReader::ELEMENT) 
     { 
      if ($i == $limit) break; 
      while ($reader->read()) 
      { 
       if ($reader->nodeType == XMLReader::TEXT 
        || $reader->nodeType == XMLReader::CDATA 
        || $reader->nodeType == XMLReader::WHITESPACE 
        || $reader->nodeType == XMLReader::SIGNIFICANT_WHITESPACE) 
       { 
        $var[$i]["id"] = $reader->value; 
       } 
       else if ($reader->nodeType == XMLReader::END_ELEMENT && $reader->name == "id") 
       { 
        break; 
       } 
      } 
      $i++; 
     } 
    } 
    $reader->close(); 

    echo '<pre>'; 
    print_r($var); 
    echo '</pre>'; 
} 

test() retourne ce tableau

Array 
(
    [0] => Array 
     (
      [id] => 345 
     ) 

    [1] => Array 
     (
      [id] => 123 
     ) 

    [2] => Array 
     (
      [id] => 789 
     ) 
) 

Comment obtenez-vous aussi la clé de nom d'utilisateur et de la valeur?

Array 
(
    [0] => Array 
     (
      [id] => 345 
      [username] => name1 
     ) 

    [1] => Array 
     (
      [id] => 123 
      [username] => name2 
     ) 

    [2] => Array 
     (
      [id] => 789 
      [username] => name3  
     ) 
) 

Ajouter à la réponse de Jose

// needed to end element 
else if ($reader->nodeType == XMLReader::END_ELEMENT && $reader->name == "username") 
{ 
    break; 
} 

Répondre

2

Cela devrait fonctionner.

function test() 
{ 
    $request = $HTTP_RAW_POST_DATA; 
    error_reporting(E_ERROR | E_WARNING | E_PARSE); 
    $url = "http://site.xml"; 
    $reader = new XMLReader(); 
    $reader->open($url);; 

    $var = array(); 
    $i = 0; 
    $limit = 3; 

    while ($reader->read()) 
    { 
     if (($reader->name == "id" || $reader->name == "username") && $reader->nodeType == XMLReader::ELEMENT) 
     { 
     $name = $reader->name; 
      if ($i == $limit) break; 
      while ($reader->read()) 
      { 
       if ($reader->nodeType == XMLReader::TEXT 
        || $reader->nodeType == XMLReader::CDATA 
        || $reader->nodeType == XMLReader::WHITESPACE 
        || $reader->nodeType == XMLReader::SIGNIFICANT_WHITESPACE) 
       { 
        $var[$i][$name] = $reader->value; 
       } 
       else if ($reader->nodeType == XMLReader::END_ELEMENT && $reader->name == "id") 
       { 
        break; 
       } 
      } 

      if($name == "username") 
     $i++; 

     } 
    } 
    $reader->close(); 

    echo '<pre>'; 
    print_r($var); 
    echo '</pre>'; 
} 

CHANGEMENTS:

($ Reader-> name == "id" || $ Reader-> nom == "nom d'utilisateur")

$ name = $ lecteur-> nom;

$ var [$ i] [$ name] = $ lecteur-> valeur;

if ($ name == "nom d'utilisateur") $ i ++;

+0

Votre code tel quel, ne fonctionne pas. – rrrfusco

1
if ($reader->name == "id" && $reader->nodeType == XMLReader::ELEMENT) 

Vous devez avoir le lecteur vérifier aussi pour

$reader->name == "username" 

En ce moment vous lisez que l'ID. Vous devez également lire le nom d'utilisateur du XML. Une fois que vous lisez également le nom d'utilisateur, vous pouvez également l'ajouter à votre tableau.

+0

Des suggestions sur la façon d'écrire cela dans la boucle while? – rrrfusco

+0

Oui, faites une autre instruction if avant d'incrémenter i. Recherchez le nom d'utilisateur comme vous recherchez l'identifiant. Je n'ai jamais utilisé la classe de lecteur XML auparavant (habituellement utiliser DOM), donc je ne peux pas parler si vous faites quelque chose de standard, mais cela semble être un moyen simple de le faire. – Jack