向 SimpleXML 文档写入数据
你不仅可以解析和读取SimpleXML,而且还可以改变SimpleXML文档。至少我们加入一些扩展:
$sxe->item->title = "XML in PHP5 "; //title元素的新内容。$sxe->item->title['id'] = 34; // title元素的新属性。$xmlString = $sxe->asXML(); // 将SimpleXML对象做为序列化的XML字符串返回print $xmlString;
互用协作性
由于SimpleXML也是基于libxml2库的,你可以在几乎不影响速度的情况下轻松的将SimpleXML对象转化成DomDocument对象。(文档不用进行内部复制),由于这个机制,你拥有了二个对象的最好部分,使用一个适合你手头工作的工具吧,它是这样使用的:
$sxe = simplexml_import_dom($dom);
$dom = dom_import_simplexml($sxe);
XSLT
XSLT是用来将XML文档转换为其它XML文档的语言,XSLT本身是用XML编写的,属于功能性语言家族,在程序处理上和面对对象语言(像PHP)有所不同。PHP4中有二种XSLT处理器:Sablotron(在广泛使用的XSLT扩展中)和Libxslt(在domxml扩展中),这两种API不互相兼容,并且使用方法也不相同。PHP5只支持libxslt处理器,之所以选择它是因为它是基于Libxml2的,因此也更符合PHP5的XML概念。
理论上将Sablotron绑定到PHP5上也是可能的,但是不幸的是没人来做。因此,如果你正在使用Sablotron,你不得不在PHP5中切换到libxslt处理器。Libxslt 是带有JavaScript异常处理支持的Sablotron,甚至可以使用PHP强大的数据流来重新实现Sablotron独有的计划处理(scheme handlers)。此外,libxslt 是最快的XSLT处理器之一,所以你还免费得到了速度的提升。(执行速度是Sablotron的二倍)。
和本文讨论的其它扩展一样,你可以在XSL扩展,DOM扩展和vice versa之间交换XML文档,实际上,你必须得这么做,因为EXT/XSL扩展并没有载入和保存XML文档的接口,只能使用DOM扩展。一开始学习XSLT转换,你不需要掌握太多的内容,这里也不存在W3C标准,因为这个API中从Mozilla“借”过来的。
首先你需要一个XSLT样式表,将下列文本粘贴到一个新文件并且保存灰articls.xsl
然后用PHP脚本调用它:
/* 将XML和XSL文档载入到DOMDocument对象*/$xsl = new DomDocument();$xsl->load("articles.xsl");$inputdom = new DomDocument();$inputdom->load("articles.xml");
/* 创建XSLT处理器,并导入样式表*/$proc = new XsltProcessor();$xsl = $proc->importStylesheet($xsl);$proc->setParameter(null, "titles", "Titles");
/* 转换并输出XML文档 */$newdom = $proc->transformToDoc($inputdom);print $newdom->saveXML();
?>
上面的例子首先使用DOM的方法load()载入XSLT样式表articles.xsl,然后创建了一个新的XsltProcessor对象,该对象导到了后面要使用了XSLT样式表对象,参数可以这样设置setParameter(namespaceURI, name, value),最后XsltProcessor对象使用transformToDoc($inputdom)开始转换并返回一个新的DOMDocument对象。
. 这个API的优点在于你可以使用同一个样式表转换许多XML文档,只需要将它载入一次然后重复使用它,因为transormToDoc()函数可以应用于不同的XML文档。
除了transormToDoc(),还有二个用于转换的方法:transformToXML($dom)返回一个字符串,transformToURI($dom, $uri)将转换之后的文档保存到文件或一个PHP数据流。注意如果你想使用XSLT的一个语法如或indent="yes",你不能使用transformToDoc(),因为DOMDocument对象不能保存该信息,只能当你将转换后的结果直接保存到字符串或文件中时才能这样做。
调用PHP函数
XSLT扩展最后一个新加的特性是能够在XSLT 样式表内部调用任何PHP函数,主张正统的XML支持者一定不会喜欢这个功能(这样的样式表有点复杂,很容易混淆逻辑和设计),在某些地方却是十分有用的。当涉及到函数时XSLT就变得很有限,即使想实现用不同的语言输出一个日期也是非常麻烦的。但是使用这个功能,处理这些就和只使用PHP一样容易。下面是向XSLT添加一个函数的代码:
function dateLang () { return strftime("%A");}
$xsl = new DomDocument();$xsl->load("datetime.xsl");$inputdom = new DomDocument();$inputdom->load("today.xml");
$proc = new XsltProcessor();$proc->registerPhpFunctions();
// 载入文档并使用$xsl来处理$xsl = $proc->importStylesheet($xsl);
/* 转换并输出XML文档 */$newdom = $proc->transformToDoc($inputdom);
print $newdom->saveXML();
?>
下面是XSLT样式表datetime.xsl,它会调用这个函数。
下面是要使用样式表转换的XML文档,today.xml(同理,articles.xml也会得到同样结果)。
上面的样式表,PHP脚本和所有的XML文件会用当前系统设置的语言输出星期的名字。你可以给php:function()添加更多的参数,添加的参数会被传递给PHP函数。这里有一个函数php:functionString(),这个函数自动将所有输入的参数转换为字符串,所以你不需要在PHP里进行转换。
注意你需要在转换之前调用$xslt->registerPhpFunctions(),否则PHP函数调用将因为安全原因不会被执行(你始终相信你的XSLT样式表吗?)。目前访问系统还没有实现,也许在将来PHP5的版本中会实现这个功能。
摘要
PHP对XML的支持已经向前迈进了一大步,它符合标准,功能强大,互用协作性强,被作为默认选项安装,已被授权使用。新加入的SimpleXML扩展提供了简单快速访问XML文档的方法,可以节省你很多的代码,尤其是当你有结构化文档或者可以使用强大的XPath时。
感谢libxml2—PHP5 XML扩展所使用的底层库,使用DTD,RelaxNG或XML Schema验证XML文档现在已经被支持了。
XSL支持也得到了翻新,现在使用Libxslt库,比原来的Sablotron库在性能上有很大提高,而且,在XSLT样式表内部调用PHP函数可以让你写出更强大的XSLT代码。
如果你已经在PHP4或其它语言中使用了XML,你会喜欢PHP5的XML特性的,XML在PHP5中有了很大的变化,符合标准,和其它工具,语言是同等的。