2011-10-21 37 views
1

我正在使用XMLReader来解析我不控制的文件。该文件缺少一些元素,例如下面。在书籍2缺少一个信息元素的地方,我仍然想把它添加到数组中。我意识到我可以使用XMLReader和SimpleXML的组合......但我想看看这是可能的吗?PHP XMLReader处理丢失的元素

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

我有以下的XMLReader功能:

<?php 
function parseXML($args){ 
    extract($args); 
    $xml = new XMLReader(); 
    $xml->open($file) or die('Cannot open file'); 

    while($xml->read()){ 
     switch($xml->nodeType){ 
      case(XMLREADER::ELEMENT):{ 
       if(in_array($xml->localName, $nodes, true)){ 
        $lName = $xml->localName; 
        $val = $xml->readString(); 
        $xml->read(); 

        $child[$lName] = trim($val); 
        if($lName == end($nodes)){ 
         $arr[] = $child; 
        } 
       } 
      } 
      break; 
     } 
    } 
    $xml->close($file); 
    return $arr; 
} 
$settings = array(
    'file' => 'books.xml', 
    'nodes' => array('name', 'info') 
); 
$books = parseXML($settings); 
var_dump($books); 
?> 

主要生产:

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

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

回答

2

你可以重新考虑你的逻辑一点。以下代码段为每个<book>元素构建一个$book数组,每次使用默认值(空字符串)开始,以防本书不存在<name><info>

由于到达<name><info>元素,其内容被添加到当前的$book阵列。

当达到</book>时,$book阵列被添加到$books的主阵列。

结果数组

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

运行完美,非常感谢回去我号楼$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; } 

。 – rossjha