1.PHP中主要的一些XML扩展
1)SAX;2)DOM;3)XPath;4)XSL;5)SimpleXML;6)XMLReader;7)XMLWrite;8)XML-RPC;9)SOAP;
2.PHP中有两种主要的XML解析器
1)基于树的解析器。它是把整个文档存储为树的数据结构中,即需要把整个文档都加载到内存中才能工作。所以,当处理大型XML文档时候,性能剧减。SimpleXML和DOM扩展属于此类型解析器。
2)基于流的解析器。它不会一次把整个文档加载到内存中,而是每次分别读取其中的一个节点并允许实时与之交互(当移向下一个节点时,上一个节点是被丢弃,但也设置为保留)。很明显,其效率要高且占内存少,不便之处代码量大点。
所以,PHP中处理大型XML文档可以用XMLReader扩展方案(基于流的解析器)。它在PHP 5.1中默认是启用的。如果是处理一些小型的XML,那还是SimpleXML来的比较简单。
3.解析RSS频道
1)SimpleXML:记住一点,如果想要得到访问属性的值,必须要先将其转为适合的类型,否则得到的就是SimpleXMLElement。如何转换,只要在前面加上(string)或(int)等即可。
2)XMLReader解析XML
具体例子见附件,为什么SimpleXML或者Zend_Feed简单多了,我们还要用XMLReader呢?如果要解析大的文档时,SAX仍旧是一个很好的选择,由于它是逐个元素进行解析,这样就可以保持PHP较低的内存占用。XMLReader将SAX的低内存和SimpleXML简单的好处集于一身。
具体XMLReader实例,查看附件,里面有我的大量注释。
4.生成RSS
生成RSS我们有两种方法,一种是DOM方法,一种是XMLWrite方法。
具体代码在附件里面。
5.获得XML中指定的节点或内容
如果我们只是需要得到XML中的某些内容,那就不需要解析所有的XML文档了。这里我们建议使用Xpath。
DOM扩展内置支持Xpath,SimpleXML也是如此,看下面例子:
1)使用DOM扩展的Xpath
$doc = new DOMDocument();
$doc->preserverWhiteSpace = false;
$doc->load('http://www.site.com/rss_feed');
$xpath = new DOMXPath($doc);
$titles = $xpath->query('//item/title');
foreach($titles as $title)
{
echo $title->nodeValue.'<br/>';
}
2)使用SimpleXML的Xpath
$doc = new SimpleXMLElement(
$url,
null,
true //告诉simpleXML我们提供的是一个URL
);
foreach ($doc->xpath('//item/title') as $title)
{
echo $title."<br/>";
}
6.Xpath的基本规则
1)正斜杠“/”是路径分隔符
2)根的绝对路径是以单个正斜杠“/”开始
3)文档中匹配元素的任何深度的相对路径以两个正斜杠“//”开始。如上:“//item/title”
4)双句号“..”表明节点为节点的父类,单句号“.”表明为当前节点
还有更多类似正则的匹配,具体查看文档