PHP XML Expat Parser
PHP XML Expat Parser
内置的外籍分析器能够处理XML文档在PHP 。
XML是什么?
XML是用来描述数据并把重点放在什么样的数据是。一个XML文件描述的结构数据。
在XML中,没有预先确定的标记。你必须定义自己的标记。
如果您想了解更多有关XML ,请访问我们的XML指南。
什么是外籍人士?
要阅读和更新-创建和操纵-一个XM L文件,您需要一个XM L解析器。
有两个基本类型的XML解析器:
树为基础的剖析:这分析器转换XML文件成一个树状结构。分析了整个文件,并提供进入树的内容。例如:文档对象模型( DOM )
基于事件的剖析:观XML文件的一系列活动。当某一特定事件发生时,它要求一个函数来处理它
该外籍分析器是一个基于事件的剖析。
基于事件的解析器重点内容的XML文件,而不是其结构。正因为如此,基于事件的剖析器可以存取数据速度快于树为基础的解析器。
看看下面的XML部分:
<from>Jani</from>
一种基于事件的剖析报告的XML上述一系列三项活动:
开始元素:从
资料,一节开始,价值:贾尼
关闭内容:从
在上述范例的XML包含格式良好的XML 。然而,例如不能有效的XML ,因为没有任何文档类型定义( DTD的)与此相关。
然而,这并没有差异时,使用外籍分析器。外籍人士是一个非验证剖析,并忽略任何DTDs 。
作为一个基于事件的,非验证XML分析器,外籍速度快,小,适合PHP的Web应用。
注: XML文件必须有充分的形成或外籍人士将产生一个错误。
安装
外籍人士的XML解析器职能是PHP核心的一部分。没有安装即可使用这些功能。
一个XML文件
XML档案下文将用于我们的榜样<?xml version="1.0" encoding="ISO-8859-1"?> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>初始化XML解析器
我们要初始化XML解析器在PHP中,确定了不同的处理XML的事件,然后解析XML文件。
例如<?php//Initialize the XML parser $parser=xml_parser_create();//Function to use at the start of an element function start($parser,$element_name,$element_attrs) { switch($element_name) { case "NOTE": echo " Note <br />"; break; case "TO": echo "To: "; break; case "FROM": echo "From: "; break; case "HEADING": echo "Heading: "; break; case "BODY": echo "Message: "; } }//Function to use at the end of an element function stop($parser,$element_name) { echo "<br />"; }//Function to use when finding character data function char($parser,$data) { echo $data; }//Specify element handler xml_set_element_handler($parser,"start","stop");//Specify data handler xml_set_character_data_handler($parser,"char");//Open XML file $fp=fopen("test.xml","r");//Read data while ($data=fread($fp,4096)) { xml_parse($parser,$data,feof($fp)) or die (sprintf("XML Error: %s at line %d", xml_error_string(xml_get_error_code($parser)), xml_get_current_line_number($parser))); }//Free the XML parser xml_parser_free($parser);?>输出结果如.Note To: Tove From: Jani Heading: Reminder Message: Don't forget me this weekend!它的原理就是:
初始化XML分析器与xml_parser_create ( )函数
创建职能,使用不同的事件处理程序
新增xml_set_element_handler ( )函数来指定哪些功能将被处死时,解析器遇到开幕式和闭幕式标签
新增xml_set_character_data_handler ( )函数来指定哪些功能将执行时遇到的分析器字符数据
解析文件“ test.xml ”的xml_parse ( )函数
如果在一个错误,新增xml_error_string ( )函数来转换XML错误的文字说明
呼叫xml_parser_free ( )函数来释放分配的内存与xml_parser_create ( )函数转载请注明来自: www.111cn.net/phper/php.html
PHP和AJAX的RSS阅读器
RSS阅读器是用来读取RSS信息
允许快速的RSS浏览新闻和更新
AJAX的RSS阅读器
在AJAX以下例子,我们将展示一个RSS阅读器的内容从RSS是载入网页无需刷新。
在HTML表单
这是HTML网页。它包含一个简单的HTML表格,并链接到一个JavaScript :
<html> <head> <script type="text/javascript" src="getrss.js"></script> </head> <body>
<form> Select an RSS-Feed: <select onchange="showRSS(this.value)"> <option value="Google">Google News</option> <option value="MSNBC">MSNBC News</option> </select> </form>
<p><div id="rssOutput"> <b>RSS Feed will be listed here.</b></div></p> </body> </html>
例如解释-的H TML表单
正如你可以看到, HTML网页上面载有一个简单的HTML表单的下拉框。
作品的形式像这样:
事件触发时,用户选择一个选项在下拉框中
当事件触发的功能要求showRSS ( )被处决。
下面的形式是一个<div>所谓的“ rssOutput ” 。这是作为一个占位符返回的数据showRSS ( )函数。转载请注明来自http://www.111cn.net/wy/yw.html
的JavaScript
JavaScript代码是储存在“ getrss.js ”和相关的HTML文件:var xmlHttpfunction showRSS(str) { xmlHttp=GetXmlHttpObject() if (xmlHttp==null) { alert ("Browser does not support HTTP Request") return } var url="getrss.php" url=url+"?q="+str url=url+"&sid="+Math.random() xmlHttp.onreadystatechange=stateChanged xmlHttp.open("GET",url,true) xmlHttp.send(null) } function stateChanged() { if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") { document.getElementById("rssOutput") .innerHTML=xmlHttp.responseText } }function GetXmlHttpObject() { var xmlHttp=null; try { // Firefox, Opera 8.0+, Safari xmlHttp=new XMLHttpRequest(); } catch (e) { // Internet Explorer try { xmlHttp=new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { xmlHttp=new ActiveXObject("Microsoft.XMLHTTP"); } } return xmlHttp; }例如解释
该stateChanged ( )和GetXmlHttpObject职能是一样的PHP的AJAX推荐的篇章。
该showRSS ( )函数
每一次的选择是选择在输入外地执行这一职能如下:
界定了网址(档)传送给服务器
添加一个参数( Q )的网址与选定的选项从下拉框中
添加一个随机数字,以防止服务器使用快取档案
吁请GetXmlHttpObject函数创建一个XMLHTTP物件,并讲述了对象执行的功能要求时stateChanged变化是触发
开幕XMLHTTP物件与特定网址。
发送一个HTTP请求到服务器
PHP页面
网页服务器要求的JavaScript代码是一个PHP文件名为“ getrss.php ” :<?php //get the q parameter from URL $q=$_GET["q"];//find out which feed was selected if($q=="Google") { $xml=("http://news.google.com/news?ned=us&topic=h&output=rss"); } elseif($q=="MSNBC") { $xml=("http://rss.msnbc.msn.com/id/3032091/device/rss/rss.xml"); }$xmlDoc = new DOMDocument(); $xmlDoc->load($xml);//get elements from "<channel>" $channel=$xmlDoc->getElementsByTagName('channel')->item(0); $channel_title = $channel->getElementsByTagName('title') ->item(0)->childNodes->item(0)->nodeValue; $channel_link = $channel->getElementsByTagName('link') ->item(0)->childNodes->item(0)->nodeValue; $channel_desc = $channel->getElementsByTagName('description') ->item(0)->childNodes->item(0)->nodeValue;//output elements from "<channel>" echo("<p><a href='" . $channel_link . "'>" . $channel_title . "</a>"); echo("<br />"); echo($channel_desc . "</p>");//get and output "<item>" elements $x=$xmlDoc->getElementsByTagName('item'); for ($i=0; $i<=2; $i++) { $item_title=$x->item($i)->getElementsByTagName('title') ->item(0)->childNodes->item(0)->nodeValue; $item_link=$x->item($i)->getElementsByTagName('link') ->item(0)->childNodes->item(0)->nodeValue; $item_desc=$x->item($i)->getElementsByTagName('description') ->item(0)->childNodes->item(0)->nodeValue;echo ("<p><a href='" . $item_link . "'>" . $item_title . "</a>"); echo ("<br />"); echo ($item_desc . "</p>"); } ?>转载请注明来自http://www.111cn.net/wy/yw.html
PHP XML DOM
内置的DOM解析器可以处理XML文档在PHP 。
这里是什么?
的W3C DOM提供了一套标准的对象为HTML和XML文件,以及一个标准的接口用于访问和操纵它们。
的W3C DOM分为不同部分(核心, XML和HTML )和不同层次( 1/2/3级的DOM ) :
*核心的DOM 定义一套标准的对象结构的任何文件
*的XML的DOM 定义一套标准的对象的X ML文件
*的HTML的DOM 定义一套标准的对象为H TML文件
如果您想了解更多有关的XML的DOM ,请访问我们的XML的DOM教程。
XML解析
要阅读和更新创建和操纵一个XM L文件,您需要一个XM L解析器。
有两个基本类型的XML解析器:
树为基础的剖析:这分析器转换XML文件成一个树状结构。分析了整个文件,并提供进入树要素
基于事件的剖析:观XML文件的一系列活动。当某一特定事件发生时,它要求一个函数来处理它
在DOM解析器是一个树为基础的剖析。
看看下面的XML文件部分:
<?xml version="1.0" encoding="ISO88591"?> <from>Jani</from>
The XML DOM sees the XML above as a tree structure:
- Level 1: XML Document
- Level 2: Root element: <from>
- Level 3: Text element: "Jani"
安装
的DOM XML解析器职能是PHP核心的一部分。没有安装即可使用这些功能。
一个XML文件
XML档案下文将用于在我们的例子:
<?xml version="1.0" encoding="ISO88591"?> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>
负载和输出的XML
我们要初始化XML分析器,载入XML和输出:
例如
$xmlDoc = new DOMDocument(); $xmlDoc>load("note.xml"); print $xmlDoc>saveXML(); ?>
输出为.
Tove
Jani Reminder Don't forget me this weekend! 如果您选择“查看源文件”在浏览器窗口中,您会看到下面的HTML :
<?xml version="1.0" encoding="ISO88591"?> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>上面的例子中创建的DOMDocument对象并加载XML从“ note.xml ”到它。
然后saveXML ( )函数来把内部的XML文件到一个字符串,这样我们就可以打印出来。
通过XML的循环
我们要初始化XML分析器,负载的XML ,并通过回路的所有要素<note>内容:
例如
<?php $xmlDoc = new DOMDocument(); $xmlDoc>load("note.xml");$x = $xmlDoc>documentElement; foreach ($x>childNodes AS $item) { print $item>nodeName . " = " . $item>nodeValue . "<br />"; } ?>结果为.#text = to = Tove #text = from = Jani #text = heading = Reminder #text = body = Don't forget me this weekend! #text =在上面的例子中看到,有空白文本节点之间的每个元素。
当XML的产生,往往含有白色空间之间的节点。对的XML DOM解析器把这些作为普通的内容,如果你不知道,他们有时会造成问题。
转载请注明来自: www.111cn.net/phper/php.html
PHP SimpleXML
SimpleXML是什么?
SimpleXML是新的PHP 5 。这是一个简单的方法获得一个要素的属性和文字,如果您知道XML文件的布局。
相比到DOM或外籍分析器, SimpleXML只需几行代码读取文本数据从一个组成部分。
SimpleXML转换XML文档到一个对象,像这样:
内容-转换为单一属性S impleXMLElement对象。当有一个以上的元素一个层次上,他们放入一个数组
属性-访问使用关联数组,如果指数对应的属性名称
元数据-数据从文本的内容转换为字符串。如果一个要素有一个以上的文本节点,他们将被安排在该命令他们发现
SimpleXML速度快,易于使用的表演时,基本任务包括:
读XML文件
提取数据从XML字符串
编辑文本节点或属性
然而,当先进的处理XML的,如名称,你是最好的外籍人士使用分析器或XML的DOM 。
安装
从PHP 5.0 , SimpleXML职能是PHP核心的一部分。没有安装即可使用这些功能。
用SimpleXML
下面是一个XML文件:
<?xml version="1.0" encoding="ISO-8859-1"?> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>
我们希望输出的元素名称和数据的XML档案以上。
这是做什么:
加载XML文件
获取的名字的第一个元素
创建一个循环,将触发每个孩子节点,使用儿童( )函数
输出元素的名称和数据,每个子节点
例如
<?php $xml = simplexml_load_file("test.xml");echo $xml->getName() . "<br />";foreach($xml->children() as $child) { echo $child->getName() . ": " . $child . "<br />"; } ?>输出结果为note to: Tove from: Jani heading: Reminder body: Don't forget me this weekend!转载请注明来自: www.111cn.net/phper/php.html
<?xml version='1.0' encoding='UTF-8'?>
<root>
<key id="5201314" name="望咩掉啊">
<user id='6789' name='不上学了'><![CDATA[我靠!!!@*&^$(*%&]]></key>
<user id="6789" name="不上学了">222</key>
</key>
<key id="5201314" name="望咩掉啊">
<user id='6789' name='不上学了'><![CDATA[我靠!!!|""!@":#$@$]]></key>
<user id="6789" name="不上学了">222</key>
</key>
<key id="5201314" name="望咩掉啊">
<user id='6789' name='不上学了'><![CDATA[我靠!!!<><><><>]]></key>
<user id="6789" name="不上学了">222</key>
</key>
</root>
<?php
/* func.xml.php 2008-09-20 kilobug
必须声明头部属性,xml每个节点的值和属性严禁出现 <、>、" 字符,如需出现,请使用CDATA
每个节点属性必须统一使用单引号'或双引号"
忽略注释,返回一个数组。
*/
$xmlContent = ''; //临时变量
/* 载入xml文件,解析后返回数组 */
function loadXML( $path, $assoc = null, $attrassoc = null ) {
return parseXML( @file_get_contents( $path ), $assoc, $attrassoc );
}
/* 解析XMl内容,返回数组 */
function parseXML( $xmltext, $assoc = null, $attrassoc = null ) {
$xmldata = array();
//转换顶部属性
$noderoot = strpos( $xmltext, '<?' );
$noderootspace = strpos( $xmltext, ' ' );
$nodefoot = strpos( $xmltext, '?>' );
$attr = trim( substr($xmltext, $noderootspace, $nodefoot-$noderoot-5) );
//转换节点
$xmldata = array_merge(
array(
array_merge(
array( substr($xmltext, $noderoot+2, $noderootspace-$noderoot-2) ),
parseXMLAttrs($attr, $attrassoc)
)
),
parseXMLNodes( trim(substr($xmltext, $nodefoot+2)), $assoc, $attrassoc )
);
return $xmldata;
}
/* 解析XML节点,返回数组 */
function parseXMLNodes( $nodestr, $assoc = null, $attrassoc = null ) {
global $xmlContent;
$xmlContent = $nodestr;
if ( empty($xmlContent) || !strstr($xmlContent, '<') ) {
return array();
}
$nodedate = array();
$i = 0;
while ( !empty($xmlContent) ) {
$noderoot = strpos( $xmlContent, '<' );
$nodefoot = strpos( $xmlContent, '>' );
$nodeend = strpos( $xmlContent, '/' );
$cdataroot = strpos( $xmlContent, '<![CDATA[' );
$cdatafoot = strpos( $xmlContent, ']]>' );
if ( $noderoot === $cdataroot ) { //判断是否CDATA
$nodedate = substr($xmlContent, $cdataroot+9, $cdatafoot-$cdataroot-9);
$xmlContent = substr( $xmlContent, strpos($xmlContent, '>', $cdatafoot+3)+1 );
break $nodedate;
} else if ( $noderoot == $nodeend-1 ) { //是否结束节点,是则返回前面的内容
if ( $i == 0 ) {
$nodedate = substr( $xmlContent, 0, $noderoot );
$xmlContent = substr( $xmlContent, $nodefoot+1 );
return $nodedate;
}
else {
$xmlContent = substr( $xmlContent, $nodefoot+1 );
break;
}
}
$nodecompart = strpos( $xmlContent, ' ' );
//判断有无属性
if ( $nodecompart != false && $nodecompart > $noderoot && $nodecompart < $nodefoot ) { //有属性
$nodedate[$i][0] = array_merge( array($assoc ? substr($xmlContent, $noderoot+1, $nodecompart-$noderoot-1) : ''), parseXMLAttrs(substr($xmlContent, $nodecompart+1, $nodefoot-$nodecompart-($nodefoot-1 == $nodeend ? 2 : 1)), $attrassoc) );
} else { //无属性
$nodedate[$i][0] = array( $assoc ? substr($xmlContent, $noderoot+1, $nodefoot-$noderoot-1) : '' );
}
$i++;
$xmlContent = substr( $xmlContent, $nodefoot+1 ); //截取本节点后面内容
if ( $nodefoot-1 == $nodeend ) { //判断是否单节点
$nodedate[$i-1][1] = '';
continue;
} else {
$nodedate[$i-1][1] = parseXMLNodes( $xmlContent, $assoc, $attrassoc );
}
}
return $nodedate;
}
/* 解析XML节点属性,返回数组 */
function parseXMLAttrs( $attrstr, $assoc = null ) {
if ( !$attrstr ) return array();
echo( $attrstr . "n" );
$attrdata = array();
$attrcenter = $attrfoot = 1; //开始转换
$tmpnum = false;
while ( $attrcenter != false ) {
$tmpnum = strpos($attrstr, '='');
$attrcenter = strpos($attrstr, '="');
if ( $tmpnum == false ) {
$attrfoot = strpos($attrstr, '"', $attrcenter+2);
} else {
$attrcenter = $tmpnum;
$attrfoot = strpos($attrstr, ''', $attrcenter+2);
}
if ( $assoc ) { //是否关联数组
$attrdata[substr( $attrstr, 0, $attrcenter)] = substr( $attrstr, $attrcenter+2, $attrfoot-$attrcenter-2 );
} else {
$attrdata[] = substr( $attrstr, $attrcenter+2, $attrfoot-$attrcenter-2 );
}
$attrstr = trim(substr($attrstr, $attrfoot+1));
if ( !$attrstr ) {
break;
}
}
return $attrdata;
}
//解析数组为XML(没写)
function parseArrayToXML( $ary ) {
}
//解析数组为XML的Nodes(没写)
function parseArrayToXMLNodes( $ary ) {
}
/* 测试
$t = microtime();
//loadXML('../books.xml');
print_r( loadXML('../test.xml', 1, 1) ); //自己找一个常见的xml文档
echo microtime() - $t;
*/
?>
相关文章
- 这篇文章主要介绍了源码分析系列之json_encode()如何转化一个对象,对json_encode()感兴趣的同学,可以参考下...2021-04-22
- PHP去除html、css样式、js格式的方法很多,但发现,它们基本都有一个弊端:空格往往清除不了 经过不断的研究,最终找到了一个理想的去除html包括空格css样式、js 的PHP函数。...2013-08-02
- index.php怎么打开?初学者可能不知道如何打开index.php,不会的同学可以参考一下本篇教程 打开编辑:右键->打开方式->经文本方式打开打开运行:首先你要有个支持运行PH...2017-07-06
PHP中func_get_args(),func_get_arg(),func_num_args()的区别
复制代码 代码如下:<?php function jb51(){ print_r(func_get_args()); echo "<br>"; echo func_get_arg(1); echo "<br>"; echo func_num_args(); } jb51("www","j...2013-10-04- 这篇文章主要介绍了PHP编程 SSO详细介绍及简单实例的相关资料,这里介绍了三种模式跨子域单点登陆、完全跨单点域登陆、站群共享身份认证,需要的朋友可以参考下...2017-01-25
解决Mybatis中mapper.xml文件update,delete及insert返回值问题
这篇文章主要介绍了解决Mybatis中mapper.xml文件update,delete及insert返回值问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-23- 这篇文章主要介绍了PHP实现创建以太坊钱包转账等功能,对以太坊感兴趣的同学,可以参考下...2021-04-20
- 这篇文章主要为大家详细介绍了php微信公众账号开发之五个坑,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-10-02
C#从数据库读取数据到DataSet并保存到xml文件的方法
这篇文章主要介绍了C#从数据库读取数据到DataSet并保存到xml文件的方法,涉及C#操作DataSet保存到XML文件的技巧,需要的朋友可以参考下...2020-06-25- 这篇文章主要介绍了JS跨浏览器解析XML应用过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-10-16
- 下面小编就为大家带来一篇js操作XML文件的实现方法兼容IE与FireFox。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-07-01
ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单
首先是数据库的设计。分类表叫cate.我做的是分类数据的二级联动,数据需要的字段有:id,name(中文名),pid(父id). 父id的设置: 若数据没有上一级,则父id为0,若有上级,则父id为上一级的id。数据库有内容后,就可以开始写代码,进...2014-05-31- 在BS中,xml,html,css和js我们都学过,起初分不清这四者的区别和联系,随着知识的增长,有了一些体会,下面通过本文给大家简单介绍 XML、HTML、CSS与JS的区别,需要的朋友参考下...2016-02-21
- 这篇文章主要介绍了PHP如何通过date() 函数格式化显示时间,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-11-13
- 今天我给大家分享的是在不刷新页面的前提下,使用PHP+jQuery+Ajax实现多图片上传的效果。用户只需要点击选择要上传的图片,然后图片自动上传到服务器上并展示在页面上。...2015-03-15
- 这篇文章主要介绍了golang与php实现计算两个经纬度之间距离的方法,结合实例形式对比分析了Go语言与php进行经纬度计算的相关数学运算技巧,需要的朋友可以参考下...2016-07-29
- 这篇文章主要介绍了Xml中使用foreach遍历对象实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-12-04
- 这篇文章主要介绍了PHP如何使用cURL实现Get和Post请求,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-07-11
- 经常看到有人踩在了PHP路径的坑上面了,感觉有必要来说说PHP中相对路径的一些坑,以及PHP中绝对路径的使用,下面一起来看看。 ...2016-08-24
AngularJS中如何使用$parse或$eval在运行时对Scope变量赋值
这篇文章主要介绍了AngularJS中如何使用$parse或$eval在运行时对Scope变量赋值的相关资料,本文介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下...2016-01-26