2010-12-03 13 views
1

次のテスト関数は、PHPのxmlreaderを使用してXMLファイルを読み取り、3つの値( "id" = key)の2次元配列を返します。PHP xmlreader to array

ユーザー名のキーと値が配列にも返されるようにコードを編集するにはどうすればよいですか? (最後に表示)

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>'; 
} 

テスト()この配列どのようにしても、ユーザー名のキーと値を得るのですか

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

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

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

を返しますか?

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

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

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

はまた、今あなたが唯一のIDを読んでいる

$reader->name == "username" 

をチェックReaderが必要ですホセの答え

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

答えて

2

これは動作するはずです。

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>'; 
} 

CHANGES:

($ reader->名== "ID" || $ reader->名== "ユーザ名")

$名= $リーダー→名前;

$ var [$ i] [$ name] = $ reader-> value;

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

+0

あなたのコードはそのままですが、動作しません。 – rrrfusco

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

に追加します。 XMLからUsernameも読まなければなりません。ユーザー名も読んだら、アレイに追加することもできます。

+0

どのようにwhileループに書き込むかに関する提案はありますか? – rrrfusco

+0

ええと、iをインクリメントする前に別のif文を実行してください。 IDを検索しているのと同じようにユーザー名を検索します。私はあなたが何か標準をしているかどうかについて話すことができないので、XMLリーダークラスを使用することは一度もありませんでしたが、それは簡単な方法です。 – Jack