一、简单介绍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>声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。
 
						

 
					 
					 
					
精彩评论