simpleXML处理
SAX方式解析XML
SAX Simple API for XML API(application program interface)
xml 的 简单的应用接口
对于dom方式,需要将整个xml文档,转化成一个完成的DOM树,存在于内存中。
如果xml文档很大的话?会导致转化为DOM树的过程很费资源。而且这个树 会 很大。
SAX的处理XML的方式:
读取的速度快、
但是 sax只适合读取xml内容
因此,当我们需要快速的获得xml内容的时候 ,可以选择 SAX的处理方式,或者xml的文档内容很多的时候,也是可以使用SAX的方式。
PHP使用SAX来完成对xml内容的读取工作:
步骤:
1, 创建XML解析器
2, 去规定如何处理我们碰到的标签或数据(创建解析处理函数)
两种标签:开始标签 和 结束标签
一个数据:
3, 开始解析
4, 解析完成后 如何处理 或者 出现错误 如何处理?
可能用到的函数:
xml_parser_create();//创建一个xml解析器。参数是编码,返回值解析器,资源
xml_set_element_handler();//设置 元素(标签)的 处理函数,设置对开始标签的处理和对结束标签的处理。参数:1,当前的解析器资源2,处理开始标签的函数,3,处理结束标签的函数
xml_set_character_data_handler();//设置 数据 的 处理函数,设置一个数据处理函数
xml_parse();//开始解析xml
xml_error_string();//处理错误的函数
1,创建XML解析器
2,去规定如何处理我们碰到的标签或数据
处理标签:
还需要对需要的函数 start_element 与 end_element来进行定义
开始:
结束:
处理数据:
定义处理器名:
定义需要的函数 data_process
3 解析:
此时,每读到一个内容,一个标签或一个数据,都会调用相应的处理函数完成处理
4 错误的处理
如何判断发生了错误?
通过判断 xml_parser()的返回值 来判读是否发生错误。但是我们需要同时提供给xml_parser第三个参数,来告知我们的xml解析器,当期已经是最后一个xml的数据,否则解析器会认为还有数据需要处理,因此,会继续等待出而不是以认为 处理完毕抛出 错误。
当 发生错误时候,我们需要使用函数去获得这个错误信息
xml_get_error_code();//错误的代码 参数:解析器
xml_get_current_line_number();//错误产生的行数,参数:解析器
xml_get_current_column_number();//错误产生的列数 参数:解析器
xml_error_string();获得错误信息,参数为错误的代码:
输出的效果:
利用CDATA处理特殊符号和数据
只需要将我们的数据 使用CDATA 标识 包围起来即可
character data
cdata的开始标识:<![CDATA[
cdata的结束标识:]]>
一般在处理中文 或者 在数据内包含 需要被实体引用的字符时,可以采用CDATA数据的格式来处理
我们使用处理器,只获得需要的数据:(标题和作者)
由于我们在数据处理函数内,没有办法获得当前是哪个标签内的数据,因此我们应该在进入到某个标签的时候,做标识,然后我们在数据处理器中判断这个标识,从而 知道我们当前处理的是哪个数据
在开始标签中做 标识
使用一个全局变量,在两个函数内传递数据 做标识
在数据处理时 判断 标识:
DOM方式 与 SAX方式的异同?
1 DOM方式需要将所有的数据读取到内存,而 SAX方式不会
2 DOM需要将所有的节点处理好之后,再操作,而SAX 边读取节点 边操作
3 当xml文档结构有问题时,DOM没有办法解析成DOM树,但是SAX方式可以一直处理,知道错误的发生地。
4 SAX的方式能读数据,DOM可以做很多复杂的操作。SAX的方式处理快,适合处理大文档。
使用SimpleXML的方式处理xml
PHP专门提供 一种 简单的处理xml的方式。
处理的方式是:将xml元素 在内存中形成以 对象集合。也是通过对象的形式加以访问。
将元素转化成对象,相同的对象会转化为对象数组,我们操作起来很容易。
如何使用?
1,实例化一个SimpleXMLElement对象
此时获得的$sxe就是一个可以操作xml文档的SimpleXMLElement对象,大家应该将其视作,xml文档的根元素,用它来操作我们的xml。
2 访问某一个节点
如果需要访问节点数据,直接使用节点的名称即可。
如果需要访问某个元素的属性,在标签上使用数组下标的方式。
如果需要循环的话,直接使用foreach遍历即可
例如:__toString();
我们还可以使用数组的形式访问某个元素
我们还可以使用数组的形式遍历某些对象集合
访问属性:
3,增加节点(元素)
只需要使用simpleXMLElement对象的addChild方法即可
增加完毕后 需要重新保存这个xml对象集合 到 某个xml文件中
只需要使用simpleXMLElement对象的asXML方法即可,参数为需要保存的文件名
在book下建立子节点
addChild方法的返回值为新建的节点
在这个节点下,直接增加子节点即可,addChild的第二个参数为节点的值
给元素增加属性
4 删除节点:
直接unset某个节点即可
5更新
直接访问到 直接赋值 即可
节点的值也可以用于与字符串比较
将SimpleXMLElement对象 与 DOM对象 相互转换
1 将 dom 转成 SimpleXMLElement
使用 simpleXML 提供的函数 即可 完成转换
先存在一个DOM的对象
再将这个对象转换成 SimpleXMLElement对象
2 将 SimpleXMLElement转成 DOM对象
先存在 simpleXMLElement对象
使用转化函数转化
使用 dom_import_simplexml()函数完成转化
参数 simpleXMLElement对象
返回值 是一个 DOMElement对象
现在是 只有一个 不属于任何DOM树的节点,哪来的DOM树?应该再有个DOMDocument对象才可以。
创建这个DOM树
将这个节点 放到这棵DOM树上?
将节点元素导入到DOM树上,注意需要递归导入,第二个参数为true
最后 确定这个节点在 DOM树中的位置?
最后对整棵树 进行处理
作业1完成xml 保存goods表内数据
将刚刚生成好的xml文件作为数据源,完成
显示列表,增加商品,删除商品的功能。
作业2 讲自己的简历信息使用xml格式表示出来
段宝轻 18:01:42
require './includes/init.php';
$sql="select goods_id from goods";
$res=$db->getAll($sql);
$dom=new DOMDocument('1.0','utf-8');
$store=$dom->createElement('store');
$dom->appendChild($store);
$goods=$dom->createElement('goods');
for($i=0;$i<count($res);$i++){
$store->appendChild($goods);
foreach($res[$i] as $key=>$value){
var_dump($res[$i]);
$goods_list=$dom->createElement($key,$value);
$goods->appendChild($goods_list);
}
}
$dom->formatOutput = true;
$dom->save('goods.xml');
职通磊 17:59:02
<?php
//链接数据库
$link = mysql_connect('localhost','root','hengqi');
mysql_select_db('shop_test',$link);
mysql_query('set names uft8');
//导出数据 返回数组类型
$rows=array();
$sql="select goods_id,goods_name,goods_number from goods";
$result = mysql_query($sql);
//创建根节点
$doc=new DOMDocument('1.0','utf-8');
$store = $doc->createElement('store');
$doc->appendChild($store);
while($row=mysql_fetch_assoc($result)){
//生成goods节点
$goods=$doc->createElement('goods');
$store->appendChild($goods);
//生成goods子节点
$goods_id=$doc->createElement('goods_id',$row['goods_id']);
$goods->appendChild($goods_id);
$goods_name=$doc->createElement('goods_name',$row['goods_name']);
$goods->appendChild($goods_name);
$goods_number=$doc->createElement('goods_number',$row['goods_number']);
$goods->appendChild($goods_number);
}
//保存
$doc->save('goods.xml');
/*
将刚刚生成好的xml文件作为数据源,完成
显示列表,增加商品,删除商品的功能。
*/
//显示列表