PHP XMLReader, работающий с отсутствующим элементом - PullRequest
1 голос
/ 21 октября 2011

Я использую XMLReader для анализа файла, который я не контролирую.В файле отсутствуют некоторые элементы, пример ниже.Там, где в книге 2 отсутствует информационный элемент, я все еще хочу добавить это в массив.Я понимаю, что мог бы использовать комбинацию XMLReader и SimpleXML ... но я хотел бы посмотреть, возможно ли это?* который производит:

Array
(
[0] => Array
    (
        [name] => book 1
        [info] => book 1 info
    )

[1] => Array
    (
        [name] => book 3
        [info] => book 3 info
    )
)

1 Ответ

2 голосов
/ 22 октября 2011

Вы могли бы немного переосмыслить свою логику.Приведенный ниже фрагмент создает массив $book для каждого элемента <book>, начиная каждый раз со значений по умолчанию (пустая строка) в случае, если <name> или <info> не существует для книги.

При достижении <name> и <info> элементов их содержимое добавляется в текущий массив $book.

При достижении </book> массив $book добавляется в основной массив$books.

Здание $books

function parseXML($args){
    extract($args);

    $xml   = new XMLReader();
    $xml->open($file) or die('Cannot open file');

    $books = array();

    while ($xml->read()) {
        // <book> - start a new child array with default values
        if ($xml->nodeType === XMLReader::ELEMENT 
         && $xml->localName === 'book') {
            $book = array_fill_keys($nodes, '');
        // </book> - add the child array to main array
        } elseif ($xml->nodeType === XMLReader::END_ELEMENT 
               && $xml->localName === 'book') {
            $books[] = $book;
        // <info> or <title> - add to child array
        } elseif ($xml->nodeType === XMLReader::ELEMENT 
               && in_array($xml->localName, $nodes, TRUE)) {
            $name = $xml->localName;
            $val  = $xml->readString();
            $book[$name] = trim($val);
        }
    }

    $xml->close();
    return $books;
}

Результирующий массив

$books = array(
  array('title' => 'book 1', 'info' => 'book 1 info'),
  array('title' => 'book 2', 'info' => ''),
  array('title' => 'book 3', 'info' => 'book 3 info'),
);
...