作者:安茂友恢复_172 | 来源:互联网 | 2013-12-26 17:40
基于树的解析器。它是把整个文档存储为树的数据结构中,即需要把整个文档都加载到内存中才能工作。所以,当处理大型XML文档时候,性能剧减。SimpleXML和DOM扩展属于此类型解析器。
PHP
中有两种主要的XML解析器
1)基于树的解析器。它是把整个文档存储为树的数据结构中,即需要把整个文档都加载到内存中才能工作。所以,当处理大型XML文档时候,性能剧减。SimpleXML和DOM扩展属于此类型解析器。
查看:php使用simplexml来解析xml
2)基于流的解析器。它不会一次把整个文档加载到内存中,而是每次分别读取其中的一个节点并允许实时与之交互(当移向下一个节点时,上一个节点是被丢弃,但也设置为保留)。很明显,其效率要高且占内存少,不便之处代码量大点。
所以,PHP中处理大型XML文档可以用XMLReader扩展方案(基于流的解析器)。它在PHP 5.1中默认是启用的。
$xmlData = <<
http://www.php230.com/
2013-06-13 01:20:01
always
1.0
http://www.php230.com/category/
2013-06-13 01:20:01
always
0.8
XML;
$xml = new XMLReader();
// $url = 'http://www.php230.com/baidu_sitemap1.xml';
// $xml->open($url);
$xml->XML($xmlData);
$assoc = xml2assoc($xml);
$xml->close();
function xml2assoc($xml) {
$tree = null;
while($xml->read())
switch ($xml->nodeType) {
case XMLReader::END_ELEMENT: return $tree;
case XMLReader::ELEMENT:
$node = array('tag' => $xml->name, 'value' => $xml->isEmptyElement ? '' : xml2assoc($xml));
if($xml->hasAttributes)
while($xml->moveToNextAttribute())
$node['attributes'][$xml->name] = $xml->value;
$tree[] = $node;
break;
case XMLReader::TEXT:
case XMLReader::CDATA:
$tree .= $xml->value;
}
return $tree;
}
我们可以查看最终返回的结果是什么:
echo '';
print_r($assoc);
echo '
';
输出结果:
Array
(
[0] => Array
(
[tag] => urlset
[value] => Array
(
[0] => Array
(
[tag] => url
[value] => Array
(
[0] => Array
(
[tag] => loc
[value] => http://www.php230.com/
)
[1] => Array
(
[tag] => lastmod
[value] => 2013-06-13 01:20:01
)
[2] => Array
(
[tag] => changefreq
[value] => always
)
[3] => Array
(
[tag] => priority
[value] => 1.0
)
)
)
[1] => Array
(
[tag] => url
[value] => Array
(
[0] => Array
(
[tag] => loc
[value] => http://www.php230.com/category/
)
[1] => Array
(
[tag] => lastmod
[value] => 2013-06-13 01:20:01
)
[2] => Array
(
[tag] => changefreq
[value] => always
)
[3] => Array
(
[tag] => priority
[value] => 0.8
)
)
)
)
[attributes] => Array
(
[xmlns] => http://www.sitemaps.org/schemas/sitemap/0.9
)
)
)
可以看到最终返回的结果是数组,这样我们可以方便地获取XML中没一项的值。