php操作xml

一、简单介绍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>


声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

精彩评论

全部回复12人评论7,777人参与