赵工的个人空间


专业技术部分转网页计算转业余爱好部分


 编程语言

常用的编程语言
C#编程语言基础
C#面向对象与多线程
C#数据及文件操作
JavaScript基础
JavaScript的数据类型和变量
JavaScript的运算符和表达式
JavaScript的基本流程控制
JavaScript的函数
JavaScript对象编程
JavaScript内置对象和方法
JavaScript的浏览器对象和方法
JavaScript访问HTML DOM对象
JavaScript事件驱动编程
JavaScript与CSS样式表
Ajax与PHP
ECMAScript6的新特性
Vue.js前端开发
PHP的常量与变量
PHP的数据类型与转换
PHP的运算符和优先规则
PHP程序的流程控制语句
PHP的数组操作及函数
PHP的字符串处理与函数
PHP自定义函数
PHP的常用系统函数
PHP的图像处理函数
PHP类编程
PHP的DataTime类
PHP处理XML和JSON
PHP的正则表达式
PHP文件和目录处理
PHP表单处理
PHP处理Cookie和Session
PHP文件上传和下载
PHP加密技术
PHP的Socket编程
PHP国际化编码
MySQL数据库基础
MySQL数据库函数
MySQL数据库账户管理
MySQL数据库基本操作
MySQL数据查询
MySQL存储过程和存储函数
MySQL事务处理和触发器
PHP操作MySQL数据库
数据库抽象层PDO
Smarty模板
ThinkPHP框架
Python语言基础
Python语言结构与控制
Python的函数和模块
Python的复合数据类型
Python面向对象编程
Python的文件操作
Python的异常处理
Python的绘图模块
Python的NumPy模块
Python的SciPy模块
Python的SymPy模块
Python的数据处理
Python操作数据库
Python网络编程
Python图像处理
Python机器学习
TensorFlow深度学习
Tensorflow常用函数
TensorFlow用于卷积网络
生成对抗网络GAN


首页 > 专业技术 > 编程语言 > PHP处理XML和JSON
PHP处理XML和JSON

XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用简单的文本格式存储和建立,也可以被任何语言读取和使用。

1.XML的结构:

XML全称为Extensible Markup Language(可扩展标记语言),是一种可扩展标记的语言,具有自描述性、内容与显示分离、可扩展性、独立于平台等特点。
XML具有很高的灵活性,但是必须遵循一定的结构,才能保证XML文档具有规范性。XML文档结构可以分为3个部分:序言、主体和尾声,其中序言和主体是必须保留的,而尾声则可以根据用户的需要来使用。
①序言:
序言是XML文档的开始,用来表示对XML数据进行编译的开始及描述字符的编码方法,并为XML解析器和应用程序提供其他一些配置线索。序言部分的格式代码为:
<?xml version="1.0" encoding="编码" standalong="yes/no"?>
其中:version用来指定采用的xml版本号,通常情况下支持的是XML1.0。Encoding指定文档的编码格式,常用的有UTF-8和GB2312两种。在未指定编码格式时,默认为UTF-8。Standalong表示使用的DTD形式,值只能是yes或no,默认为no。如果为yes,说明所有必需的实体声明都包含在文档中;如果是no,则说明需要引用外部实体。
UTF-8格式,标记以及标记的内容可以使用中文、日文、英文等,XML解析器就会识别这些标记并正确解析标记中的内容;使用GB2312格式,则标记以及标记的内容只可以使用ASCII字符和中文。
②主体:
主体是XML文档描述数据的地方,通常由标记、元素和属性等构件组成。
③尾声:
XML文档的尾部内容包括注释、处理指令和/或紧跟元素树后的空白。由于大多数应用程序在文档根元素的结束标记处就结束了,而不再对尾部进行任何处理,所以尾部对于XML文档来说不起任何作用。用户可以根据需要选择是否添加尾声。
示例:
<?xml version="1.0' encoding="UTF-8" ?>
<Books>
<Book id="HN330">
<Title>十万个为什么</Title>
<Publisher>电子工业出版社</Publisher>
</Book>
<Book id="HN331">
<Title>马可波罗行记</Title>
<Publisher>商务印书馆</Publisher>
</Book>
</Books>
在这个XML中,只有序言和主体,其中<Books>是根元素,包括两个Book子元素,每个Book元素的结构都相同,包含一个Title元素和一个Publisher元素。
在XML主体中,除了XML元素外,还包括XML属性。XML属性是指标记内使用“属性名称=值”形式的代码,示例中的id就是Book标记的属性。
XML文档的扩展名为.xml,可以在任何文本编辑器中修改。

2.创建一个XML文档:

PHP可以动态生成HTML,当然也可以生成XML。在生成XML时,数据通常都是读取数据库中的,为了演示方便这里使用数组代替。
⑴创建一个名为xml.php的示例文件,并声明两个变量:
<?php
$user="玩主"; //定义收藏夹名称
$desc="我的个人收藏夹"; //定义收藏夹描述
?>
⑵创建一个数组保存收藏夹中的网站名称、中文名称和网站地址:
<?php
$sites=array( //在数组中定义XML的内容
array(
'name'=>"baidu",
'cn_name'=>"百度",
'url'=>"www.baidu.com"),
array(
'name'=>"google",
'cn_name'=>"谷歌",
'url'=>"www.google.com"),
);
?>
⑶在PHP值声明为XML格式,然后指定编码集:
<?php
header("Content-Type: text/xml"); //声明为XML格式
echo "<?xml version='1.0' encoding='utf-8' ?>"; //指定XML的声明和编码
echo "<sites>";
echo "<name>{$user}</name>\r\n";
echo "<title>{$desc}</title>\r\n";
foreach($sites as $site) { //遍历数组输出XML格式内容
echo "<site>\r\n";
echo "<name>{$site['name']}</name>\r\n";
echo "<cn_name>{$site['cn_name']}</cn_name>\r\n";
echo "<url>{$site['url']}</url>\r\n";
echo "</site>\r\n";
}
echo "</sites>";
?>
可见,用PHP动态生成XML文档并不复杂,只需要用header()函数将文档的MIME类型改成”text/xml”,以此声明输出的是XML格式;然后指定XML的根节点sites,再对数组进行遍历输出site节点,每个节点又包括name、cn-name和url节点。
⑷最后在浏览器中执行xml.php文件

3.SAX解析XML:

SAX(Simple API for XML)是一个基于事件驱动型的XML解析模型,适用于对XML文档的遍历,不需要修改内容的情况。使用SAX时,每次打开或关闭一个标记,或者每次解析器到文本时,就执行节点或文本的事件处理函数。
当使用SAX解析XML文档时,它将针对各种事件调用不同的处理程序函数。
①创建SAX解析器:
要使用SAX解析XML文档,首先需要创建一个解析器。PHP中使用xml_parser_create()函数创建XML解析器。语法格式为:
xml_parser_create(string $encoding)
xml_parser_create()函数将建立一个新的XML解析器,并返回可被其他XML函数使用的资源句柄。$encoding参数为可选参数,表示指定解析后输出数据的编码,可以是UTF-8或GBK等编码。
创建SAX解析器之后,便可以使用xml_parser()函数解析XML文档,此时将触发各种事件处理器。数据处理完毕后调用xml_parser_free()函数释放解析器。xml_parser()函数语法格式为:
int xml_parser(resource $parser, string $data [, bool $is_final])
其中,$data参数是要处理的XML字符串,为了使最后一块数据被解析,可选的$is_final参数应设为true。如果解析器成功解析XML,将返回true,否则返回false。
可以使用xml_get_error_code()函数获取错误的编号,再使用xml_error_string()函数将错误编号转换成字符串。
②元素处理器:
xml_set_element_handler()函数可以设置元素处理器。语法格式为:
bool xml_set_element_handler(resource $parser, callback $start_element_handler, callback $end_element_handler)
其中,$parser参数表示要使用的XML解析器,$start_element_handler参数和$end_element_handler表示处理器函数的名称,并且这两个函数都是按引用传递的。当XML解析器遇到元素的开始标记时,会调用$start_element_handler元素处理函数,该函数必须有3个参数,语法格式为:
start_element_handler(resource $parser, string $name, array $attribs)
这里的3个参数分别表示:调用处理程序的XML解析器引用、开始元素的名称和解析器遇到元素的属性数组。
当XML解析器遇到元素的结束标记时,会调用$end_element_handler元素处理函数,该函数必须有2个参数,语法格式为:
end_element_handler(resource $parser, string $name)
这里的$parser参数表示调用处理程序的XML解析器引用,$name参数为被调用的元素名。
③字符数据处理器:
元素之间所有文本由字符数据处理器处理。PHP中,通过xml_set_character_data_handler()函数设置遇到每一个字符数据块时调用的处理器。语法格式为:
bool xml_set_character_data_handler(resource $parser, callback $handler)
其中,$parser参数表示触发处理程序的XML解析器的引用,$handler参数表示作为事件处理器使用的函数。
由$handler参数指定的函数必须有两个参数,语法格式为:
handler(resource $parser, string $data)
示例:handler事件处理函数
function char($parser, $data)
{
echo $data; //输出节点文本
}
④默认处理器:
只要能在XML文档中找到数据,就可以调用xml_set_default_handler()函数解析XML文档。
xml_set_default_handler()函数为XML解析器建立默认的数据处理器,如果成功创建处理器返回true,否则返回false。语法格式为:
bool xml_set_default_handler(resource $parser, callback $handler)
这里的$parser参数表示要使用的XML解析器,$handler参数表示事件处理器使用的函数。示例:
<?php
$parser=xml_parser_create(); //新建解析器
function mydefault($parser, $data) //创建默认处理器函数
{
echo $data;
}
xml_set_default_handler($parser, "mydefault"); //指定默认处理器函数
$fp=fopen("newslist.xml","r"); //打开XML文档
while ($data=fread($fp,4096)) //读取XML文档
{
xml_parser($parser, $data , feof($fp)); //解析XML
}
xml_parser_free($parser); //释放XML解析器
?>

4.DOM解析XML:

DOM(Document Object Model文档对象模型)解析XML时,需要把整个XML文件加载到内存中去,并以一棵节点树的形式存在。当加载完成后,可以对节点树中的每一个节点进行操作。换句话说,通过DOM应用程序可以对XML文档进行随机访问。这种访问方式给应用程序的开发带来了很大的灵活性,可以任意地控制整个XML文档中的内容,从而执行添加、删除、修改等操作。比如一个简单的XML文档:
<?xml version="1.0" encoding="gb2312" ?>
<Books>
<Book>
<id>0515</id>
<title>唐诗三百首</title>
<price>15.2</price>
</Book>
</Books>
上述是由一个节点组成的DOM树结构,Books是文档的根节点,在根元素里面包含一个Book子节点;Book又包括3个子节点id、title和price,并且都包含了相应的数据信息。
DOM提供了很多用于解析时从XML中获取数据的函数,如下表:


函数

说明

DOMDocument()

创建一个DOM对象

load('name.xml')

加载XML文件name.xml到内存

getElementsByTagName("book")

获取当前节点下book节点的列表对象

item(index)

获取index指定索引值的节点对象

nodeValue()

获取节点的值

getAttribute("name")

获取当前节点name属性的值

示例说明:通过DOM方式进行解析
⑴在图书XML文档books.xml的目录中创建一个实例文件,名称为dom_xml.php。
⑵利用DOM提供的函数,先从XML文档读取网站的名称和地址信息。
<h1>儿童读物</h1>
<table cellpadding="0" cellspacing="0">
<tr>
  <th class="first">编号</th>
  <th>图书名称</th>
  <th>价格</th>
</tr>
<?php
$doc=new DOMDocument(); //创建DOM对象
$doc->load("books.xml"); //载入外部的xml文件
$books=$doc->getElementsByTagName("Book"); //获取Book节点列表
foreach ($books as $book) //循环读取每个节点的信息
{
$idText=$book->getAttribute('id'); //获取id属性的值
$booktitle=$book->getElementsByTagName("Title");
$titleText=$booktitle->item(0)->nodeValue;  //获取title节点的值
$bookpub=$book->getElementsByTagName("Publisher");
$pubText=$bookpub->item(0)->nodeValue;  //获取Publisher节点的值
?>
<tr class="bg">
<tr class="first style"><?php echo $idText; ?></td>
<tr><?php echo $titleText; ?></td>
<tr><?php echo $pubText; ?></td>
</tr>
<?php } ?>
</table>
?>
示例中,首先创建了一个DOM对象实例,然后调用load()函数载入books.xml。语句$doc -> getElementsByTagName("Book")返回的是一个包含所有Book节点的集合,所以下面使用foreach语句循环该集合,再依次获取每个节点的值,最后在表格中输出。
⑶将PHP文件和XML文件放在同一目录,然后浏览dom_xml.php文件查看读取XML文档的效果。
DOM还提供了一种快速输出内容的方法,就是调用saveXML()函数。示例:
<?php
$doc=new DOMDocument(); //创建DOM对象
$doc->load("newslist.xml"); //载入外部的xml文件
print $doc->saveXML(); //输出XML文档的内容
?>
还可以使用DOM创建一个XML文档。示例:
<?php
$dom=new DOMDocument("1.0", "utf-8"); //创建DOM对象
$root=$dom->createElement("Books"); //创建根节点Books
$book=$dom->createElement("Book"); //创建节点Book
$title=$dom->createElement("Title"); //创建节点Title
$publisher=$dom->createElement("Publisher"); //创建节点Publisher

$id=$dom->createAttribute("id"); //创建属性id
$idText=$dom->createTextNode("HN330"); //创建属性id的值
$titleText=$dom->createTextNode("十万个为什么"); //创建节点Title的值
$pubText=$dom->createTextNode("商务印书馆"); //创建节点Publisher的值

$id->appendChild($idtext); //将值添加到id节点
$publisher->appendChild($pubText); //将值添加到Publisher节点
$title->appendChild($titleText); //将值添加到Title节点

$book->appendChild($id); //向Book节点添加id属性
$book->appendChild($title); //向Book节点添加Title节点
$book->appendChild($publisher); //向Book节点添加Puclisher节点

$root=$dom->appendChild($root); //生成根节点Books
$book=$root->appendChild($book); //生成Books下的Book节点
$dom->save("Books1.xml"); //保存到Books1.xml文件
?>
上述代码执行后将创建一个Books1.xml文件,其中保存了生成的XML内容

5.SimpleXML解析XML:

SimpleXML是PHP5核心的一部分,因此无需安装或引用外部扩展,就可以对XML文档进行处理。
SimpleXML也是解析和操作简单XML文档的最佳解析器,它会把XML转换为对象,然后通过属性提供每个节点元素的访问方法,还可以对从任何节点中获取的文本值进行字符串转换。
·simplexml_load_file:加载一个XML文件,此方法包含3个参数,第1个为XML本地路径或URL;第2个参数是可扩展SimpleXML类,可选,用于指定类名;第3个参数用于指定libxml参数,可选。
$objXML=simplexml_load_file('/common.xml');
·simplexml_load_string:创建一个SimpleXML对象,如果向其传递了有效的XML字符串,可以活动SimpleXML对象,否则会获得false值。示例:
$objXML=simplexml_load_string('<?xml version="1.0"?><book><name>My favourite book </name> </book>');
此方法也有3个参数,后面两个参数可选,与simplexml_load_file的后两个参数相同。
创建SimpleXML对象也可以使用SimpleXMLElement类。示例:
$objXML=new SimpleXMLElement('<?xml version="1.0"?><book><name>My favourite book </name> </book>');
SimpleXML会将XML文档转换为SimpleXML对象,文档中的元素被转换为SimpleXMLElement对象的单一属性。当同一级别上存在多个元素时,它们会被置于数组中,通过使用关联数组进行访问属性,下标对应属性名称。如果一个元素拥有多个文本节点,则按照它们被找到的顺序进行排列。下表列出了SimpleXML解析XML文档时的常用函数:


函数

说明

__construct()

创建一个新的SimpleXMLElement对象。执行成功则返回一个对象,否则返回false

addAttribute()

为SimpleXMLElement元素添加一个属性,函数无返回值

addChild()

给SimpleXMLElement元素添加一个子元素

asXML()

从SimpleXMLElement元素获取一个子元素

attributes()

获取SimpleXML元素的属性

children()

获取指定节点的子节点

getDocNamespaces()

获取XML文档的命名空间

getName()

获取SimpleXML元素的名称

getNamespaces()

从XML数据获取命名空间

registerXPathNamespace()

为下一次XPath查询创建命名空间语句

simplexml_import_dom()

从DOM节点获取SimpleXMLElement对象

simplexml_load_file()

从XML文档获取SimpleXMLElement对象

simplexml_load_string()

从XML字符串获取SimpleXMLElement对象

Xpath()

对XML数据运行XPath查询

示例:使用SimpleXML方式解析XML文档
XML文档NewsList.xml内容为:
<?xml version="1.0" encoding="UTF-8" ?>
<newslist>
<news isnew="1">
<id>5</id>
<title>PHP编程</title>
<desc>从零开始学习</desc>
<date>2012-08-8</date>
</news>
<news isnew="1">
<id>6</id>
<title>评论模块</title>
<desc>欢迎发表评论</desc>
<date>2012-07-29</date>
</news>
<news isnew="0">
<id>7</id>
<title>创建PHP开发环境</title>
<desc>基于WAMP的开发</desc>
<date>2012-7-12</date>
</news>
</newslist>
创建simple_xml.php文件,并与NewsList.xml保存到相同目录,其内容为:
<fieldset><legend>使用SimpleXML解析XML</legend>
<?php
$xml=simplexml_load_file("roster.xml"); //载入XML文档
foreach ($xml->children() as $art) //遍历XML文档节点
{
if($art->getName()=="student") { //输出student节点的ID属性
    echo ("student的ID属性:".$art->attributes()->ID."<br />");
}
foreach($art->children() as $item) { //输出student节点下的内容
echo ($item->getName()."节点:".$item."<br />"); //输出节点名和值
}
}
echo ("<br />运行XPath查询所有的name节点:<br />");
$byline=$xml->xpath("/roster/student/name"); //运行XPath查询
foreach ($byline as $item)
{
echo "$itemt,"; //输出节点值
}
?>
</fieldset>
<h3>站内公告</h3>
<table width="500" cellpadding="2" cellspacing="2">
<tr>
<th class="first">编号</th>
<th>标题</th>
<th>描述</th>
<th>发表日期</th>
<tr/>
<?php
$xml=simplexml_load_file("NewsList.xml"); //载入XML文档
foreach ($xml->children() as $news) //遍历XML文档节点
{
    $hot="";
if($news->getName()=="news") { //获取isnew属性
     $hot=$news->attributes()->isnew=="1"?"<img src='images/hot.gif'/>":" ";
}
?>
<tr class="bg">
   <td height="32" class="first style1"><?php echo $news->id; ?></id>
   <td><img border="0" src="images/jt1.gif" width="11" height="11"><?php
      echo $news->title; ?><?php echo $hot; ?></td>
   <td><?php echo $news->desc; ?></td>
   <td><?php echo $news->date; ?></td>
</tr>
<?php } ?>
</table>
SimpleXML还可以使用对象的方式生成XML文档。示例:
<?php
//创建一个SimpleXML对象的XML,根节点是config
$xml=new SimpleXMLElement('<?xml version="1.0" encoding="utf-8" ?><config/>');
$xml->addChild("desc", "数据库配置文件"); //添加节点desc
$db=$xml->addChild('database'); //添加节点database
$db->addAttribute('type', 'mysql'); //为database添加type属性
$db->addChild('host', 'localhost'); //为database添加子节点host
$db->addChild('user', 'root'); //为database添加子节点user
$db->addChild('pass', '123456'); //为database添加子节点pass
$xml->asXML("config.xml"); //保存到config.xml
v?>
上述代码执行后,将在程序目录创建一个config.xml文化,内容为:
<?xml version="1.0" encoding="utf-8' ?>
<config>
   <desc>数据库配置文件</desc>
   <database type="mysql">
      <host>localhost</host>
      <user>root</user>
      <pass>123456</pass>
   </database>
</config>
可以使用libxml_use_internal_errors(true);来抑制XML错误,便于代码自行处理。
XPath用于导航XML文档,提供一组标准的表达式和函数来遍历文档树。PHP拥有对XPath的内置支持。

6.JSON:

JSON是JavaScript Object Notation的缩写,意思是JavaScript对象方法,现在成为一种非常流行的数据交换格式。JSON比XML更加轻量和快速,更加轻松地在Ajax应用客户端中使用。
JSON对象以{开始,以}结束,之间是键-值对集合,每个键-值对之间以逗号分开,,键和值之间则以冒号分隔,键为简单的字符串,值可以是字符串、数组、数字、布尔值或空,字符串必须在双引号中。要求数据为UTF-8格式。

1)json_encode()函数

json_encode()函数从对象和数组创建JSON字符串,其中有两个参数,第一个是要编码的值,第二个参数可选,包含控制如何编码的特殊字符选项。可作为第二参数的常量有:
·JSON_HEX_TAG:将<和>分别转换为\u003C和\u003E
·JSON_HEX_AMP:将&s转换为\u0026
·JSON_HEX_APOS:将'转换为\u0027
·JSON_HEX_QUOT:将"转换为\u0022
·JSON_FORCE_OBJECT:强制以对象形式而不是以数组形式返回JSON字符串中的值

2)json_decode()函数:

将字符串JSON字符串转换为对象。示例:
$json=<<<JSON {
   "origin":"Delhi",
   "destination":"London",
   "passengers":[{"name":"Mr. perry Mason"."type":"Adult","age":25},
               {"name":"Miss Irene Adler"."type":"Adult","age":24}],
               "travelDate":"17-Dec-2010"}
JSON;
json_decode()函数将有效的JSON字符串转换为对象,有三个参数,第1个参数是JSON字符串;第2个参数为可选,默认值false,如果设为true将转换为关联数组;第3个参数是JSON字符串中递归结构的最大允许深度,可选。

3)json_last_error()函数:

函数没有参数,捕获JSON解析中发生的错误,返回一个整数值,可以检查该值来了解特定的错误。PHP为这些错误值提供了一些预定义常量:
·JSON_ERROR_NONE:表示JSON已成功解析,没有错误
·JSON_ERROR_SYNTAX:表示JSON字符串中存在一个语法错误
·JSON_ERROR_CTRL_CHAR:遇到了无效控制字符
·JSON_ERROR_DEPTH:JSON字符串超出了最大允许的栈深度

4)PHP与jQuery数据交互:

用jQuery从PHP请求一些JSON数据,然后在网页中显示。
php中输出用:
header('Content-Type:text/json');
echo json_encode($travelDetails);
jQuery中调用Ajax方法$.getJSON()获取数据。

 

Copyright@dwenzhao.cn All Rights Reserved   备案号:粤ICP备15026949号
联系邮箱:dwenzhao@163.com  QQ:1608288659