SAX获取xml文档数据及与DOM方式的区别

昨天学习了php 通过DOM的方式来解析XML

DOM就是 javascript DOM的操作,将HTML的元素解析成js可以操作的对象

PHP DOM操作就是将 XML文档转换成PHP可以操作的对象

JavaDOM操作,将XML文档转换成 Javas可以操作的对象

 

 

SAX方式解析XML文档也是其他语言通用的方法:

Simple API for XML: 简单的应用程序接口,不光给php提供了,还给其他语言提供了

 

优点:

相对于DOM操作的缺点:在DOM方式解析XML文档之前,需要先将这个XML文档转换成DOM节点树,保存到内存了

如果XML文档有错误,会导致整个XML文档都无法解析

但是如果这个XML文档特别大的话,太浪费我么你的内存资源了

 

SAX优点在于:

解析不需要在内存中生成节点树;遇到一个标签 或者 遇到一个数据就解析一下,解析完毕,释放内存资源,缺点在于没办法确定节点之间的关系,只适合于处理数据,如果XML文档内容特别大,或者我们需要的只是数据,建议使用 SAX方式

 


SAX解析XML文档:

需要用到的函数:XML解析器

xml_parser_create() : 创建一个解析器

xml_set_element_handler() 建立开始标签和结束标签处理器

//参数1,解析器资源

//参数2,开始标签处理函数

//参数3,结束标签处理函数

xml_set_character_data_handler() 建立数据处理器

//参数1,解析器资源

//参数2,数据集处理函数

xml_parse()  开始解析XML文档

//参数1,解析器资源

//参数2,数据集

//参数3,如果被设置为 TRUE,则 data 为当前解析中最后一段数据。 

解析完毕,解析成功还是解析失败?

如果失败,获得错误信息

xml_get_error_code()  获得错误的代码/编号

xml_error_string() 获得错误的信息

//获得错误的代码/编号

$code=xml_get_error_code($parser);

//获得错误的信息

echo xml_error_string($code)."<br/>";

xml_get_current_line_number()   获得错误所在的行数

xml_get_current_column_number() 获得解析器错误所在的列数

 

步骤:

思考题:

完成 只获得 数据,不要标签名字

 

需求:

只让你查询数据库的配置

 

CDATA:

指的是 不被XML解析器解析的数据,如果数据被 <![CDATA[     ]]> 包起来,XML解析器就不再解析,原封不动的输出,通常用于 实体引用,特殊字符

SAX  和 DOM的区别:

1. DOM 每次解析的时候都会把这个文档在内存中生成一棵节点树,SAX不会

2. SAX遇到一个标签就处理一下,遇到数据处理数据,处理结束就会被释放,节省内存

3. SAX适合于XML文档特别大的时候,或者SAX只适合处理数据,无法确定节点之间的关系,无法做更复杂的操作

 

 

SAX XML文档的 提供的解析器(API)所有的语言都可以使用

 

 

SimpleXML  PHP专门提供的解析XML文档的,比SAX处理起来更简单

三中数据格式

XML---->

JSON--->

String---->

 

<?php

    //创建一个解析器

    $parser=xml_parser_create("utf-8");

//建立开始标签和结束标签处理器

//参数1,解析器资源

//参数2,开始标签处理函数

//参数3,结束标签处理函数

    xml_set_element_handler($parser,"start_element","end_element");

function start_element($parser,$name,$attr){

      //  echo $name."<br/>";

  //做一标记

  $GLOBALS['flag']=$name;

}

function end_element($parser,$name){

// echo $name."<br/>";

}

//获得文件内容(数据集)

$data=file_get_contents("config.xml");

//建立数据处理器

//参数1,解析器资源

//参数2,数据集处理函数

xml_set_character_data_handler($parser,"handler");

function handler($parser,$data){

//echo $GLOBALS[$name];

//echo $data."<br/>";

//只获得数据库配置

if($GLOBALS['flag']=="HOST"){

    echo  $data."<br/>";

}else if($GLOBALS['flag']=="DBNAME"){

echo  $data."<br/>";

}else if($GLOBALS['flag']=="USER"){

echo  $data."<br/>";

}else if($GLOBALS['flag']=="PASS"){

echo  $data."<br/>";

}

//smarty配置

if($GLOBALS['flag']=="LEFT_DELIMITER"){

    echo  $data."<br/>";

}else if($GLOBALS['flag']=="RIGHT_DELIMITER"){

 echo  $data."<br/>";

}

}

//开始解析XML文档

//参数1,解析器资源

//参数2,数据集

//参数3,如果被设置为 TRUE,则 data 为当前解析中最后一段数据。 

$resulte=xml_parse($parser,$data,true);

if($resulte){

    echo "succeed";

}else{

//获得错误的代码/编号

$code=xml_get_error_code($parser);

//获得错误的信息

echo xml_error_string($code)."<br/>";

//获得错误所在的行数

echo xml_get_current_line_number($parser)."<br/>";

//获得解析器错误所在的列数

echo xml_get_current_column_number($parser);

}    

 

 

<?xml version="1.0" encoding="utf-8"?>

<config><db><host>localhost</host><dbname>with_the_rent</dbname><user>root</user><pass>admin123</pass> </db><smarty><left_delimiter><![CDATA[<{]]></left_delimiter><right_delimiter><![CDATA[}>]]></right_delimiter></smarty></config>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值