function parseNamespaceXml($xmlstr)
{
$xmlstr = preg_replace('/\sxmlns="(.*?)"/', ' _xmlns="${1}"', $xmlstr);
$xmlstr = preg_replace('/<(\/)?(\w+):(\w+)/', '<${1}${2}_${3}', $xmlstr);
$xmlstr = preg_replace('/(\w+):(\w+)="(.*?)"/', '${1}_${2}="${3}"', $xmlstr);
$xmlobj = simplexml_load_string($xmlstr);
return json_decode(json_encode($xmlobj), true);
}
$xmlstr = '<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<item>
<title>My Title</title>
<description>My Item</description>
<dc:publisher>ABC</dc:publisher>
<dc:creator>DEF</dc:creator>
<dc:date>2009-02-12T16:53:25Z</dc:date>
</item>
</channel>
</rss>';
$arr = parseNamespaceXml($xmlstr);
print_r($arr);
实际上,以上处理只是把命名空间的冒号(:)变换为下划线(_),同时把解析结果变换成数组。
数组变换用到一点小技巧,就是通过 json_encode 和 json_decode 来实现