Mar 24 2008

simplexml和名字空间namespaces

用simplexml来解析xml文件,似乎是php中最简单的方法了。所以我决定用它来处理rss和atom,但在使用中碰到很多问题,现记录下来。
1.simplexml读取CDATA中的内容。

$string = <<

Joe
Jane

I 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