Mar 24 2008
simplexml和名字空间namespaces
用simplexml来解析xml文件,似乎是php中最简单的方法了。所以我决定用它来处理rss和atom,但在使用中碰到很多问题,现记录下来。
1.simplexml读取CDATA中的内容。
$string = <<
Joe
JaneI know that's the answer -- but what's the question?
]]>XML;
$xml = simplexml_load_string($string);
var_dump($xml);
?>
结果:
object(SimpleXMLElement)#1 (4) {
["title"]=>
string(11) "Forty What?"
["from"]=>
string(3) "Joe"
["to"]=>
string(4) "Jane"
["body"]=>
object(SimpleXMLElement)#2 (0) {
}
}
$string = <<
Joe
Jane
I know that's the answer -- but what's the question?
]]>
XML;
$xml = simplexml_load_string($string, 'SimpleXMLElement', LIBXML_NOCDATA);
var_dump($xml);
?>
结果:
object(SimpleXMLElement)#1 (4) {
["title"]=>
string(11) "Forty What?"
["from"]=>
string(3) "Joe"
["to"]=>
string(4) "Jane"
["body"]=>
string(57) "
I know that's the answer -- but what's the question?
"
}
2.simplexml读取带名字空间的元素。
以本blog的rss2.0文件为例 http://blog.cuoluo.cn/feed/
$xmlstring = file_get_contents('http://blog.cuoluo.cn/feed/');
$xml = simplexml_load_string($xmlstring);
$item = $xml->channel->item[0];
var_dump($item);
?>
结果:
object(SimpleXMLElement)#3 (7) {
["title"]=>
string(44) "火箭22连胜,每一天都在创造奇迹"
["link"]=>
string(35) "http://blog.cuoluo.cn/2008/03/17/7/"
["comments"]=>
string(44) "http://blog.cuoluo.cn/2008/03/17/7/#comments"
["pubDate"]=>
string(31) "Mon, 17 Mar 2008 07:49:59 +0000"
["category"]=>
object(SimpleXMLElement)#4 (0) {
}
["guid"]=>
string(35) "http://blog.cuoluo.cn/2008/03/17/7/"
["description"]=>
object(SimpleXMLElement)#2 (0) {
}
}
$xmlstring = file_get_contents('http://blog.cuoluo.cn/feed/');
$xml = simplexml_load_string($xmlstring);
$item = $xml->channel->item[0];
$ns_content = $item->children('http://purl.org/rss/1.0/modules/content/');
var_dump($ns_content);
?>
结果:
object(SimpleXMLElement)#4 (1) {
["encoded"]=>
object(SimpleXMLElement)#5 (0) {
}
}
3.simplexml中的xpath读取带名字空间的元素
$xmlstring = file_get_contents('http://blog.cuoluo.cn/feed/atom');
$xml = simplexml_load_string($xmlstring);
$xml->registerXPathNamespace('r','http://www.w3.org/2005/Atom');
foreach ($xml->xpath('//r:title') as $title) {
print "$title\n";
}
?>
Leave a Reply