您的位置:首页 > 其它

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

2014-04-01 14:45 302 查看
昨天学习了php 通过DOM的方式来解析XML

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

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

Java的DOM操作,将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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: