simpleXML处理

来源:互联网 发布:淘宝鬼脚七博客 编辑:程序博客网 时间:2024/04/27 21:12

SAX方式解析XML

SAX  Simple API for XML  APIapplication 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

解析:

此时,每读到一个内容,一个标签或一个数据,都会调用相应的处理函数完成处理

错误的处理

如何判断发生了错误?

通过判断 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 边读取节点 边操作

xml文档结构有问题时,DOM没有办法解析成DOM树,但是SAX方式可以一直处理,知道错误的发生地。

4 SAX的方式能读数据,DOM可以做很多复杂的操作。SAX的方式处理快,适合处理大文档。

使用SimpleXML的方式处理xml

PHP专门提供 一种 简单的处理xml的方式。

处理的方式是:将xml元素 在内存中形成以 对象集合。也是通过对象的形式加以访问。

将元素转化成对象,相同的对象会转化为对象数组,我们操作起来很容易。

如何使用?

1,实例化一个SimpleXMLElement对象

此时获得的$sxe就是一个可以操作xml文档的SimpleXMLElement对象,大家应该将其视作,xml文档的根元素,用它来操作我们的xml

访问某一个节点

如果需要访问节点数据,直接使用节点的名称即可。

如果需要访问某个元素的属性,在标签上使用数组下标的方式。

如果需要循环的话,直接使用foreach遍历即可

例如:__toString();

我们还可以使用数组的形式访问某个元素

我们还可以使用数组的形式遍历某些对象集合

访问属性:

3,增加节点(元素)

只需要使用simpleXMLElement对象的addChild方法即可

增加完毕后 需要重新保存这个xml对象集合 到 某个xml文件中

只需要使用simpleXMLElement对象的asXML方法即可,参数为需要保存的文件名

book下建立子节点

addChild方法的返回值为新建的节点

在这个节点下,直接增加子节点即可,addChild的第二个参数为节点的值

给元素增加属性

删除节点:

直接unset某个节点即可

5更新

直接访问到 直接赋值  即可

节点的值也可以用于与字符串比较

SimpleXMLElement对象 与 DOM对象 相互转换

将 dom 转成 SimpleXMLElement

使用 simpleXML 提供的函数 即可 完成转换

 先存在一个DOM的对象

再将这个对象转换成 SimpleXMLElement对象

将 SimpleXMLElement转成 DOM对象

先存在 simpleXMLElement对象

使用转化函数转化

使用 dom_import_simplexml()函数完成转化

参数 simpleXMLElement对象

返回值 是一个 DOMElement对象

现在是 只有一个 不属于任何DOM树的节点,哪来的DOM树?应该再有个DOMDocument对象才可以。

创建这个DOM

将这个节点 放到这棵DOM树上?

将节点元素导入到DOM树上,注意需要递归导入,第二个参数为true

最后 确定这个节点在 DOM树中的位置?

最后对整棵树 进行处理

作业1完成xml 保存goods表内数据

将刚刚生成好的xml文件作为数据源,完成

显示列表,增加商品,删除商品的功能。

作业讲自己的简历信息使用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文件作为数据源,完成

    显示列表,增加商品,删除商品的功能。

*/

//显示列表