一、简单介绍xml
什么是xml?
XML:eXtensible Markup Language,可扩展标记语言
标记语言
Html,xhtml,html5,xml
不同点:xml和html系列
目的不同,html用于显示,xml用于传输数据库
内容不同,html有预定义好的标签,而xml没有,所有的都需要自己来定义。
可扩展
所谓可扩展,就是可以自己定义标签。
实际上,在xml中,所有的标签都是需要自己来定义。
XML 指可扩展标记语言,是独立于软件和硬件的信息传输工具。
XML 是一种标记语言,很类似 HTML。
XML 的设计宗旨是传输数据,而非显示数据
XML 标签没有被预定义。您需要自行定义标签。
XML 被设计为具有自我描述性。
XML 是 W3C 的推荐标准。
xml的作用
主要是两大块:数据存储、数据传输(交换)
存储方面:
配置文件,如qq、feiq、迅雷
小型数据库,对于一些不经常变化的数据(数据量不是很大),可以使用xml来保存
数据传输方面:
Ajax:Asynchronous JavaScript and xml,异步的js和xml
Web service:web 服务 天气预报、ip查询、电话号码归属地查询,机票查询
新的应用:svg
Svg:可伸缩的矢量图形 伴随着H5(移动端)而生的。
重点还是在传输方面。尤其是web service。
二、PHP DOM模型操作XML
PHP5支持的
在我们的DOM模型中,存在两种模式:
1、标准DOM模式与非标准DOM模式
标准模式对于值的处理采用的是文本节点的方式
非标准模式采用的是把元素的标签与值放在同一节点中
而我们的PHP DOM模型采用的就是非标准模式
2、如何使用PHP DOM模型
解析之前,脑海中要有一个概念:面、串、点
面:整个XML结构在内存中的表现形式就是一个面
串:在我们XML结构中,所有的同级兄弟节点,串起来就形成一个串
点:在我们的XML结构中,所有的元素(标签|节点)都是我们所谓的点
3、xml是如何到内存中形成树状结构的
1)基本的XML文件
2)开辟一个面空间 通过PHP在内存中开辟一个空间
3)载入XML文件 通过PHP载入XML文件到内存中
4)形成树状结构
5)我们需要的是标签里面的值属于一个点
6)找点
4、常用的解析类:
DOMDocument 面 DOMNode 属于祖先类或父类
DOMNodeList 串
DOMElement 点
实例代码演示 面->串->点的过程
新建一个library.xml文件
<?xml version="1.0" encoding="UTF-8"?> <books> <book> <title>学习xml</title> <price>99.00</price> <isbn>111-11-1</isbn> </book> <book category="编程"> <title>web开发</title> <price>88.00</price> <isbn>222-22-2</isbn> </book> </books>
php代码如下:
<?php $dom = new DOMDocument('1.0','utf-8'); //1、开启一个面空间,参数一 版本号,参数二 编码 $dom->load('library.xml'); //2、载入xml文件到内存中 形成树状结构 //print_r($dom); //可以输出看一下$dom里面到底有什么东西 $books = $dom->getElementsByTagName('book'); //3、通过getElementsByTagName获取我们要的book集合 也就是我们所说的串 //print_r($books); 串只有一个属性length和一个方法item() //4、该找点了 //print_r($books->length); //输出2 表示book标签的数量 //print_r($books->item(0)->getElementsByTagName('title')->item(0)->nodeValue); //output: 学习xml ?>
5、如何去遍历我们的数据?
<?php for($i = 0; $i < $books->length; $i++) { // echo '该书分类是:'.$books->item($i)->getAttribute('category')."<br/>"; //输出book节点的category属性的值 echo '图书名称:'.$books->item($i)->getElementsByTagName('title')->item(0)->nodeValue.'<br/>'; echo '图书价格:'.$books->item($i)->getElementsByTagName('price')->item(0)->nodeValue.'<br/>'; echo 'isbn编码:'.$books->item($i)->getElementsByTagName('isbn')->item(0)->nodeValue.'<br/>'; echo "<hr/>"; } /* 以上循环完毕输出: //该书分类是:xml 图书名称:学习xml 图书价格:99.00 isbn编码:111-11-1 //该书分类是:编程 图书名称:web开发 图书价格:88.00 isbn编码:222-22-2 */ ?>
6、PHP DOM增加数据
问题:如何增加数据?
appendChild()
答:先想想你是怎么去查数据库的,然后逆向思维,是不是可以反向追加
1、首先创建title节点
2、创建price节点
3、创建isbn节点
4、创建book
5、追加title到book节点下
6、追加price到book节点下
7、追加isbn到book节点下
8、找到根节点
9、追加book到books根节点
10、保存xml文件
xml添加数据demo如下:
<?php $dom = new DOMDocument('1.0','utf-8'); //1、开启一个面空间,参数一 版本号,参数二 编码 $dom->load('library.xml'); //2、载入xml文件到内存中 形成树状结构 /*PHP DOM操作xml之增加数据 */ //3、创建title、price、isbn节点 $title = $dom->createElement('title','学习Linux'); //最终形成的xml格式: <title>学习Linux</title> $price = $dom->createElement('price','130.00'); //最终形成的xml格式: <price>130.00</price> $isbn = $dom->createElement('isbn','333-33-3'); //最终形成的xml格式: <isbn>333-33-3</isbn> //4、创建book节点 $book = $dom->createElement('book'); //createElement()方法没有给第二个参数,即最终形成的xml格式为: <book></book> //5、追加title、price、isbn节点到book节点下 $book->appendChild($title); $book->appendChild($price); $book->appendChild($isbn); //6、找到根节点 $books = $dom->getElementsByTagName('books')->item(0); //7、在将book节点追加到根节点下 $books->appendChild($book); //8、保存xml文件 $dom->save('library.xml'); die('add success'); ?>
7、PHP DOM 更新数据
步骤:
使用函数: public DOMNode DOMNode::replaceChild (DOMNode $newnode,DOMNode $oldnode)
确认我们使用的是replaceChild方法
该方法共有两个节点(参数)
第一个为新创建的节点
第二个为要修改或替换的节点
1)首先要有一个新节点,createElement
2)找到老节点 getElementsByTagName
3)找到要修改节点的父节点
4)replaceChild替换
xml修改数据demo如下:
<?php $dom = new DOMDocument('1.0','utf-8'); //1、开启一个面空间,参数一 版本号,参数二 编码 $dom->load('library.xml'); //2、载入xml文件到内存中 形成树状结构 /*PHP DOM操作xml之修改数据 */ //3、创建新节点 $new_node = $dom->createElement('title','学习Redis'); //4、找到老节点 $old_node = $dom->getElementsByTagName('title')->item(2); //找到第3个title节点 //5、找到父节点 $book = $dom->getElementsByTagName('book')->item(2); //6、替换(修改) $book->replaceChild($new_node,$old_node); //参数1是新节点 参数2是老节点 //7、保存xml文件 $dom->save('library.xml'); die('update success'); ?>
8、PHP DOM 删除数据
步骤:
使用函数: public DOMNode DOMNode::removeChild(DOMNode $oldnode)
确认我们要使用的方法为removeChild();
1、找到要删除的老节点$oldnode
2、找到其父节点
3、应用removeChild
4、保存数据
xml删除数据demo如下:
<?php $dom = new DOMDocument('1.0','utf-8'); //1、开启一个面空间,参数一 版本号,参数二 编码 $dom->load('library.xml'); //2、载入xml文件到内存中 形成树状结构 /*PHP DOM操作xml之删除数据 */ //3、找到老节点$old_node $old_node = $dom->getElementsByTagName('book')->item(2); //第3个book节点 //4、找到父节点(根节点) $root = $dom->getElementsByTagName('books')->item(0); //虽然books节点只有一个,但是计算机不知道 所以我们还需要使用item(0)告诉计算机为第1个books节点 //5、删除节点 $root->removeChild($old_node); //6、保存xml $dom->save('library.xml'); die('delete success'); ?>
9、读取元素的属性
demo如下:
<?php $dom = new DOMDocument('1.0','utf-8'); //1、开启一个面空间,参数一 版本号,参数二 编码 $dom->load('library.xml'); //2、载入xml文件到内存中 形成树状结构 $book = $dom->getElementsByTagName('book')->item(1); //第2个book节点 //如果第2个book节点有category属性 则输出category属性的值 if($book->hasAttribute('category')) { echo '该书分类是:'.$book->getAttribute('category'); //output: 该书分类是:编程 } ?>
10、添加元素属性
demo如下(这里是用添加xml节点的时候给所选的节点添加一个自定义属性):
<?php $dom = new DOMDocument('1.0','utf-8'); //1、开启一个面空间,参数一 版本号,参数二 编码 $dom->load('library.xml'); //2、载入xml文件到内存中 形成树状结构 /*PHP DOM操作xml之增加数据 */ //3、创建title、price、isbn节点 $title = $dom->createElement('title','学习Linux'); //最终形成的xml格式: <title>学习Linux</title> $price = $dom->createElement('price','130.00'); //最终形成的xml格式: <price>130.00</price> $isbn = $dom->createElement('isbn','333-33-3'); //最终形成的xml格式: <isbn>333-33-3</isbn> //4、创建book节点 $book = $dom->createElement('book'); //createElement()方法没有给第二个参数,即最终形成的xml格式为: <book></book> //添加自定义属性start $book->setAttribute('category','操作系统'); //给book节点添加一个category属性 值为操作系统 //添加自定义属性end //5、追加title、price、isbn节点到book节点下 $book->appendChild($title); $book->appendChild($price); $book->appendChild($isbn); //6、找到根节点 $books = $dom->getElementsByTagName('books')->item(0); //7、在将book节点追加到根节点下 $books->appendChild($book); //8、保存xml文件 $dom->save('library.xml'); die('add success'); ?>
三、SimpleXML(PHP内置类库)操作XML
1、CURD
在PHP DOM中,我们是通过开辟面,通过load函数导入xml到内存实现xml树状结构,在SimpleXML中,这个只需要一步即可完成。
simpleXMLElement simplexml_load_file ( string $filename)
simplexml_load_file():自动载入xml文件到内存,并生成树状结构。
查询demo:
<?php //1、导入xml文件到内存中 $simplexml = simplexml_load_file('library.xml'); //print_r($simplexml); //2、输出第一本书的title echo $simplexml->book[0]->title; //output: 学习xml ?>
2、获取子节点
public SimpleXMLElement SimpleXMLElement::children()
demo如下:
<?php //1、导入xml文件到内存中 $simplexml = simplexml_load_file('library.xml'); //2、遍历子元素(输出title price isbn) foreach($simplexml->children() as $val) { echo $val->title."<br/>"; echo $val->price."<br/>"; echo $val->isbn."<hr/>"; } /*以上遍历完成输出如下: 学习xml 99.00 111-11-1 web开发 88.00 222-22-2 */ ?>
3、在我们simplexml中,元素属性,是以文本节点的方式进行存储的,调用的时候直接['属性名']即可。
4、SimpleXML增加数据(以及添加元素的自定义属性)
所使用到的函数:public SimpleXMLElement SimpleXMLElement::addChild(string $name [, string $value])
该函数有两个参数,第一个参数$name,节点名称,第二个参数$value,节点值
注意:在PHP DOM中,创建元素采用的是逆向,appendChild,而在我们Simplexml中采用的是正向
demo如下:
<?php //1、先创建simplexml对象 $simplexml = simplexml_load_file('library.xml'); //2、 创建book节点 $book = $simplexml->addChild('book'); //2.1 创建的book节点的时候给book节点添加自定义属性 $book->addAttribute('category','搜索'); //book节点的结果: <booke category="搜索"></book> //3、在book节点创建title price isbn子节点 $book->addChild('title','学习讯搜XunSearch'); $book->addChild('price','360.00'); $book->addChild('isbn','666-66-6'); //4、保存xml文件 $simplexml->asXML('library.xml'); die('add success'); ?>
四、案例:调用流行API接口查询天气预报
1、搜索开发平台,自动提供了我们现成API接口,一般都是返回XML或JSON格式的数据
2、如果实在查询不到,可以通过firebug,findder进行数据抓包
3、天气预报接口(这里使用的是百度的一个开放接口,使用此接口需要先申请一个秘钥即key 具体参考网址进行申请)
百度开发平台:http://lbsyun.baidu.com/index.php?title=car/api/weather
常用的网上的API接口调用方式有两种:
第一种:get请求(模拟) 第二种:post请求(模拟)
get请求除了通过http请求,还可以一种最简单的方式获取数据(即直接在浏览器输入接口的URL地址即可)。
get请求在一般情况下发送中文的时候会有一个问题,就是乱码,导致结果失败
进行编码加(解)密
url加密函数 urlencode(url) 作用:把汉字转化url编码格式 转换后如:北京
url解密函数 urldecode(url) 作用:解密已经被加密的url编码格式
好了,废话不多说 新建一个weather_api.php文件 代码如下:
<?php if(isset($_POST['sub'])) { $city = urlencode($_POST['city']); //将中文转码 //下面url中的ak参数是你在百度开发平台所申请的key $url = "http://api.map.baidu.com/telematics/v3/weather?location={$city}&ak=aARG0UssGngni2fT9F0OU4B5VEYPOn16"; $str = file_get_contents($url); //请求$url地址并获取结果 注意: file_get_contents()只能应用于get请求 //var_dump($str); $xml = simplexml_load_string($str); //把XML字符串转成SimpleXMLElement对象,方便我们接下来对数据的操作 //var_dump($xml); echo '您查询的城市为:'.$xml->results->currentCity."<br/>"; echo '今天天气情况:'.$xml->results->weather_data->date[0]."<br/>"; echo '出行建议:'.$xml->results->index->des[0]; /*最终结果如下: 您查询的城市为:深圳 今天天气情况:周六 12月10日 (实时:24℃) 出行建议:建议着长袖T恤、衬衫加单裤等服装。年老体弱者宜着针织长袖衬衫、马甲和长裤。 */ } ?> <h1>天气预报查询</h1> <form method="post" action=""> 请输入您要查询的城市名称:<input type="text" name="city" value="<? if(isset($city)){ echo urldecode($city); } ?>"><br/> <input type="submit" value="查询" name="sub"> </form>
声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。
精彩评论