2010-12-03 78 views
1

以下測試功能讀取與PHP的XMLReader的一個XML文件,並返回3個值(「ID」 =鍵)的2維陣列。PHP的XMLReader到陣列

如何,您可以編輯代碼,使用戶名鍵和值數組也返回? (末顯示)

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  
     ) 
) 

添加到聖何塞的回答

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

變化:

($閱讀器 - >名== 「ID」 || $閱讀器 - >名== 「用戶名」)

$名稱= $閱讀器 - >名稱;

$變種[$ i]於[$名] = $閱讀器 - >值;

如果($名稱== 「用戶名」) $ I ++;

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

你需要有讀者也檢查

$reader->name == "username" 

現在你只讀取ID。您還必須從XML讀取用戶名。一旦你還讀取了用戶名,你也可以將它添加到你的數組中。

+0

如何編寫while循環有什麼建議? – rrrfusco 2010-12-03 19:35:56

+0

是的,在增加i之前做另一個if語句。搜索用戶名,就像搜索ID一樣。我以前從來沒有使用過XML讀取器類(通常使用DOM),所以我不能說你是否正在做一些標準的事情,但這似乎是一個簡單的方法來完成它。 – Jack 2010-12-03 19:38:44