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