Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
处理缺少元素的PHP XMLReader_Php_Xmlreader - Fatal编程技术网

处理缺少元素的PHP XMLReader

处理缺少元素的PHP XMLReader,php,xmlreader,Php,Xmlreader,我正在使用XMLReader解析一个我无法控制的文件。该文件缺少一些元素,如下例。如果book 2缺少一个info元素,我仍然希望将其添加到数组中。我意识到我可以使用XMLReader和SimpleXML的组合。。。但我想看看这是否可行 <book> <title>book 1</title> <info>book 1 info</info> </book> <book> <titl

我正在使用XMLReader解析一个我无法控制的文件。该文件缺少一些元素,如下例。如果book 2缺少一个info元素,我仍然希望将其添加到数组中。我意识到我可以使用XMLReader和SimpleXML的组合。。。但我想看看这是否可行

<book>
    <title>book 1</title>
    <info>book 1 info</info>
</book>
<book>
    <title>book 2</title>
</book>
<book>
    <title>book 3</title>
    <info>book 3 info</info>
</book>

你可以重新考虑一下你的逻辑。下面的代码片段为每个
元素构建了一个
$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;
}
Array
(
[0] => Array
    (
        [name] => book 1
        [info] => book 1 info
    )

[1] => Array
    (
        [name] => book 3
        [info] => book 3 info
    )
)
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'),
);