PHP xmlreader для массива - PullRequest
       4

PHP xmlreader для массива

1 голос
/ 03 декабря 2010

Следующая тестовая функция читает XML-файл с помощью PHP xmlreader и возвращает двумерный массив из 3 значений («id» = ключ).

Как вы можете отредактировать код так, чтобы ключ имени пользователя и значение возвращались также в массиве? (показано в конце)

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

test () возвращает этот массив

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 ]

2 голосов
/ 03 декабря 2010

Это должно работать.

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

ИЗМЕНЕНИЯ:

($ reader-> name == "id" || $ reader-> name == "username")

$ name = $ reader-> name;

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

if ($ name == "имя пользователя") $ i ++;

1 голос
/ 03 декабря 2010
if ($reader->name == "id" && $reader->nodeType == XMLReader::ELEMENT)

Вам нужно, чтобы читатель также проверил на

$reader->name == "username"

Сейчас вы только читаете ID.Вы также должны прочитать имя пользователя из XML.Как только вы прочитаете имя пользователя, вы также можете добавить его в свой массив.

...