浅谈PHP处理XML文档的技术手段(二)——DOM解析器

本文主要介绍基于树的XML解析器,特别是DOM解析器。DOM解析器将XML文档转化为树状结构,通过DOMDocument类等接口进行操作。虽然DOM占用较多内存,适合小规模XML文档处理,但它提供了丰富的API,支持XML文档的创建、读取和修改。
摘要由CSDN通过智能技术生成

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(
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值