昨天学习了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>