XML解析器可分为两大类:(1).基于事件驱动的XML解析器。(2).基于树的解析器。
在上一篇文章中,我们浅谈了一种典型的基于事件驱动的XML解析器——SAX解析器。今天来看看第二种,基于树的解析器。
与第一种解析器相比,基于树的解析器能够一次性分析整个XML文档,并且把分析结果保存在一个树状结构中,并提供一组API来访问这个树状结构。
典型的基于树的XML解析器有:DOM解析器、SimpleXML解析器等等。
DOM(document object model)即文档对象模型.DOM是一组创建和编辑XML文档的标准编程接口,我们可以通过DOM动态地对XML文档进行各种处理。除此之外,DOM是一个与平台无关和组织结构无关的模型,DOM解析器读取XML文档,并且将它划分为各种对象:元素对象、属性对象和注释对象等等。DOM解析器为XML文档的每一个元素创建一个树状结构,因为它能够快速搜索XML文档的任何元素。
但因DOM需要占据大量的内存,所以适合处理较小的XML文档。
DOM提供了各种内置的类,用于在PHP中解析XML文档。
1.DOMDocument类
DOMDocument类派生于DOMNode基类,以下是用DOMDocument类对XML文档进行各种操作。
创建文档对象
例如:
$dom=new DOMDocument('1.0','UTF-8');//创建文档对象
两个参数分别表示XML文档的版本号、文档的字符编码。
装入XML文档
有两种方法:
$dom->load('Student.xml',LIBXML_NOBLANKS);//将XML文档装入到文档对象中,并删除所有的空白符
$xml='<?xml version="1.0" encoding="UTF-8"?><root><child></child></root>';
$dom->loadXML($xml);
前一个方法第一个参数为XML文档的文件名或者路径,第二个方法的参数表示包含XML文档的字符串。LIBXML_NOBLANKS常量表示删除对象树中的所有空白符。
输出DOMDocument对象内容
也有两种方法:
$dom->save('demo1.xml');//输出对象内容,以demol.xml的形式保存
$xmldata='<?xml version="1.0" encoding="UTF-8"?><root><child></child></root>';
$dom->loadXML($xmldata);
print $dom->saveXML();
save()方法将DOM对象树内容输出到由参数指定的文件中,返回值是保存到文件的字节数。
saveXML()方法将DOM对象树内容输出到一个字符串中,执行成功则返回一个XML字符串,失败则返回FALSE值。
格式化文档
$dom->formatOutput=true;//格式化文档
读取XML文档的根元素
$root=$dom->documentElement;//读取根元素
创建元素节点对象
$root=$dom->createElement('STUDENTDETALL');//创建元素节点对象
$dom->appendChild($root);//将元素节点对象加到文档对象中去
$child=$dom->createElement('employee');//创建元素节点对象
$root->appendChild($child);//将元素节点对象加到另外一个元素节点对象中,成为它的子元素
创建属性节点
$attr1=$dom->createAttribute('ID');//创建属性节点对象
$attr1->value="S0001";//设置属性的值
$name->appendChild($attr1);//将属性节点对象加到元素节点对象中
2.DOMNode类
DOMNode类是DOM API中大多数类的基类,提供了几个公共函数,不能作为单独的类来使用。它提供的方法和属性可以用于派生于该类的子类。
常见的DOMNode属性有:nodeType、childNodes、nodeValue、nodeName等等,这里就不一一举例说明它们了。
常见的节点类型常量有:XML_ELEMENT_NODE、XML_TEXT_NODE、XML_ATTRIBUTE_NODE等等。可以使用这些常量来判定元素节点的类型。
例如:
foreach($children as $child){
//遍历根节点下的所有子节点的集合,格式:foreach(数组名 as 下标名)
if($child->nodeName=="STUDENTDETALL")
{
foreach(