2010-12-03 7 views
1

다음 테스트 함수는 PHP의 xmlreader를 사용하여 XML 파일을 읽고 3 개의 값 ("id"= key)의 2 차원 배열을 반환합니다.PHP xmlreader to array

사용자 이름 키와 값이 배열에 반환되도록 코드를 편집 할 수 있습니까? 어떻게 당신은 또한 이름의 키와 값을받을 수 있나요이 배열

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

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

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

반환)

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 
      [username] => name1 
     ) 

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

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

는 또한 지금 당신은 단지 ID를 읽고

$reader->name == "username" 

확인 판독기가 필요 호세의 대답

// 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"|| $ reader-> 이름 == "사용자 이름"$ reader-> 이름) 독자 -> 이름;

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

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

+0

코드가있는 그대로 작동하지 않습니다. – rrrfusco

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

에 추가합니다. 또한 XML에서 사용자 이름을 읽어야합니다. 사용자 이름을 읽은 후에도 배열에 추가 할 수 있습니다.

+0

while 루프에서 작성하는 방법에 대한 제안 사항이 있으십니까? – rrrfusco

+0

예. i를 늘리기 전에 다른 if 문을 사용하십시오. ID를 검색하는 것처럼 사용자 이름을 검색하십시오. 나는 XML 리더 클래스를 사용하지 않았다. (보통 DOM을 사용한다.) 그래서 당신이 뭔가 표준을하고 있다면 말할 수 없다.하지만 그렇게 할 수있는 간단한 방법처럼 보인다. – Jack