2011-10-21 89 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