PHP SimpleXMLElement 添加带 Namespace 的节点

Posted by 任平生 on October 10, 2014
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
>
	<channel>
		<title>IT 乱谈</title>
		<link>http://itluantan.com/</link>
		<item>
			<title>#01 第一次亲密接触</title>
			<itunes:author>IT 乱谈</itunes:author>
			<itunes:explicit>no</itunes:explicit>
		</item>
	</channel>
</rss>

使用 PHP SimpleXMLElement 生成 feed 的 xml 文件时候,怎么添加带 namespace 的节点: 查手册 addAttribute ,语法是这样:

addAttribute ( string $name [, string $value [, string $namespace ]] )

于是,代码这么写

$xml_root = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?><rss></rss>";
$xml = new SimpleXMLElement($xml_root);
$xml -> addAttribute('itunes', 'http://www.itunes.com/dtds/podcast-1.0.dtd', 'xmlns');

但总是报错:

Warning:  SimpleXMLElement::addAttribute(): Attribute requires prefix for namespace in 

搜索后修改写法:

$xml_root = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>".
			"<rss version=\"2.0\" xmlns:itunes=\"http://www.itunes.com/dtds/podcast-1.0.dtd\"></rss>";
$xml = new SimpleXMLElement($xml_root);

这下 OK 了。

<item> 里添加带 namespace 的节点时:

$xml_item -> addChild('itunes:author', 'IT乱谈', 'http://www.itunes.com/dtds/podcast-1.0.dtd');

搜索时,发现另一种写法

$xml_item -> addChild('test:itunes:author', 'IT乱谈');

test:itunes:author 前缀的前缀(test可以是任意字符),可以偷懒不用每次都写 namespace uri 。