首页 > 技术文章 > Xml 学习二

nyxd 2016-04-07 11:25 原文

  1. 使用PHPDOM模型操作XML

XML的树状结构:

s

1、xml文档

1.1、创建DOM

//创建DOM
$M = new DOMDocument('1.0','utf-8');

 

1.2、加载XML文档

//加载要解析的XML文档
$M->load('demo.xml');

1.3、保存xml文档(暂留)

$M->save('demo.xml');
				

语法说明:save(fileName)

参数说明:另存为文档的名称

2、通过PHPDOM模型操作元素

2.1、查询

基本语法:

$M->getElementsByTagName('age')->item(0)->nodeValue;
				

  • 语法详解1:getElementsByTagName(nodeName)

参数详解:nodeName    要查询节点的名称

  • 语法详解2:item(index)

参数详解:index 索引

实例代码:

//1、查询节点
$data1 = $M->getElementsByTagName('name')->item(0)->nodeValue;
$data2 = $M->getElementsByTagName('name')->item(1)->nodeValue;
$data3 = $M->getElementsByTagName('name')->item(2)->nodeValue;

echo $data1.'<hr/>';
echo $data2.'<hr/>';
echo $data3.'<hr/>';

运行效果:

  • 语法详解3:    nodeValue 节点内容值
  • 语法详解:如果要把创建的新节点插入到根元素中,必须找到根元素。

$M->documentElement->appendChild($newNode);
$M->getElementsByTagName('person')->item(0)->appendChild($newNode);

 

21、创建

$M->createElement('class','PHP十五期');
				

  • 语法说明:createELement(nodeName,Value);

参数说明:nodeName 新建节点的名称

         Value        [可选]新建节点的值

  • 拓展:创建一个有子元素的元素。

示例代码:

//1、实例化 DOMDocument
$M = new DOMDocument('1.0','utf-8');
//2
、载入XML文档
$M->load('demo.xml');
//3
、创建一个包含子元素的元素
//创建一个父节点
$parentNode = $M->createElement('class');
//
创建两个子节点
$childNode1 = $M->createElement('class1','PHP15');
$childNode2 = $M->createElement('class2','PHP16
');
//
将创建的子节点插入到创建的父节点中
$parentNode->appendChild($childNode1);
$parentNode->appendChild($childNode2);
//
将创建的父节点插入到根元素中。
$M->documentElement->appendChild($parentNode);
//4
、另存为
$M->save('newXML.xml');

 

2.3、修改

//1、实例化
$M= new DOMDocument('1.0','utf-8');
//2
、载入被解析的XML文档
$M->load('demo.xml');
//3
、修改XML元素内容
//3.1找到被修改的节点
$oldNode = $M->getElementsByTagName('class')->item(0);
$newNode = $M->createElement('class','PHP16
');
//3.2
到被修改的父元素
$rootNode = $M->documentElement;
//3.3
在父元素中修改子元素
$rootNode->replaceChild($newNode,$oldNode);
//4
、另存为XML文件
$M->save('replace.xml');

  • 基本语法:replaceChild(newNode,oldNode)
  • 参数说明:newNode 使用createELmenet方法创建的元素

     oldNoed    使用getElemente方法找到的被替换的元素

2.4、删除

//1实例化
$M= new DOMDocument('1.0','utf-8');
//2
载入xml
$M->load('replace2.xml');
//3
删除节点
//3.1、找到要删除节点的父节点
$parentNode = $M->getElementsByTagName('name')->item(2);
//3.2
、找到要删除的节点
$oldNode = $M->getElementsByTagName('nikeName')->item(0);
//3.3
、基于父节点删除节点
$parentNode->removeChild($oldNode);
//4
、另存为xml文件
$M->save('remove2.xml');

基本语法:removeChild(oldNode)

参数说明:oldNode是通过getElementsByTageName 找到的要删除节点

思路总结:要删除一个节点,我们必须先找到它的父节点,然后找到要删除的节点,在要删除元素的父节点上使用removeChild方法删除旧节点

3、属性

3.1查询属性

//1、实例化
$M = new DOMDocument('1.0','utf-8');
//2
、载入xml文档
$M->load('attribte_get.xml');
//3
、找到要操作的书写的节点
$node = $M->getElementsByTagName('zhang_san')->item(0);
//4
、基于找到的节点上查询要查询的属性
$attributeValue = $node->getAttribute('sex');
echo '
我是'.$node->getAttribute('name').'我的年龄'
.$node->getAttribute('age')
.'
我的性别'.$node->getAttribute('sex');

语法说明:getAttribute(Name)

参数说明:name    要查询属性的名称

思路整理:找到要查询数据所在的元素,在该元素上使用getAttribute()方法,查询具体的属性。

 

3.2添加/修改属性

//1、实例化
$M = new DOMDocument('1.0','utf-8');
//2
、载入xml文档
$M->load('attribute_get.xml');
//3
、找到要添加属性的节点
$node = $M->getElementsByTagName('zhang_san')->item(0);
//3.1
、设置属性
$node->setAttribute('job','程序猿');
//4
、保存XMl文档
$M->save('attribute_save.xml');

  • 基本语法:setAttribute(name,value);
  • 参数说明:name    属性的名称

Value    属性的值

  • 思路整理1:如果要添加一个属性的值,那么我们先得找到要添加属性的元素,然后基于该元素,通过setAttribute方法设置属性。
  • 思路整理2:使用setAttribute方法,如果该元素中存在该属性,那么该属性会被修改,如果该属性不存在,会添加一个新的属性。

 

 

 

 

 

3.3、删除属性

//1、实例化
$M = new DOMDocument('1.0','utf-8');
//2
、载入xml文档
$M->load('attribute_save.xml');
//3
、删除属性
//3.1、找到属性所在节点
$parentNode = $M->getElementsByTagName('zhang_san')->item(0);
//3.2
、在该元素上操作属性
$parentNode->removeAttribute('sex');
//4
、保存
$M->save('attribute_remove.xml');

  • 基本语法:removeAttribute(name);
  • 参数说明:name    属性的名称
  • 思考整理:要删除的一个元素的属性,必须要先找到该元素,然后基于该元素使用removeAttribute方法删除指定属性。

 

  1. 使用SimpleXML模型操作XML

  1. 初始化DOM 模型

$M = simplexml_load_file('demo.xml');
				

语法说明:Simplexml_load_file(fileName)

参数说明:fileName    要解析的XML文档路径

2、节点

2.1、查询子节点

实例代码:

$M
							= simplexml_load_file('demo.xml');
//
获取根元素下数据
echo '我是'.$M->name.'我的芳龄'.$M->age.'我的性别'.$M->sex;
//
获取有子节点的元素中的数据
echo '<hr/>';
$arr = $M->sex;
foreach($arr as $item){
echo $item->sex1;
echo '<br>';
echo $item->sex2;
echo '<br>';
echo $item->sex3;
}

 

2.2、添加子节点

//载入XML文档
$M = simplexml_load_file('demo.xml');
//
在根元素下添加一个新节点
$M->addChild('job','PHP工程师');
//
name节点中添加子节点
$M->name->addChild('name1','大明');
$M->name->addChild('name2','
小明');
$M->name->addChild('name3','
三明');
//
另存为XML
$M->asXML('data.xml');

基本语法:addChild(name,value);

参数详解:name    要创建的元素的名称

         Value 元素中包含的内容

思路整理:找到要添加子节点的节点,在该节点上使用addChild方法添加新节点。

  1. 属性

2.1、查询属性

//载入要解析的XML
$M = simplexml_load_file('demo.xml');
//
要查询属性的元素
$node = $M->name;
//
在该元素中使用attributes()获取该元素上的属性对象
echo $node->attributes()->id;

  • 基本语法:attribute() 返回该元素上的属性对象
  • 思路整理:找到该元素,在该元素上使用attributes方法返回该元素上的属性对象,通过调用对象属性的方式,来获取该元素上属性的值。

2.2、添加属性

//载入要解析的XML
$M = simplexml_load_file('demo.xml');
//
要查询属性的元素
$node = $M->name;
//
在该元素中使用attributes()获取该元素上的属性对象
echo $node->attributes()->id;
//
给元素添加一个属性
$node->addAttribute('nikeName','王二明');
//
保存XML数据
$M->asXML('data2.xml');

基本语法: addAttribute(name,value);

参数详解:name    属性名称

     Value    属性的值

4、xpath

4.1、通过绝对路径(/根元素/具体元素)查询节点内容

$M = simplexml_load_file('demo.xml');
//
通过绝对路径查询节点
$arr = $M->xpath('/person/sex');
//
通过数组方式获取元素内容
//$arr[0]->name;
foreach($arr as $item){
echo $item->sex1;
echo '<br>';
echo $item->sex2;
echo '<br>';
echo $item->sex3;
}

4.2、通过相对路径(//)查询元素内容

$M
						= simplexml_load_file('demo.xml');
$arr = $M->xpath('//job');
foreach($arr as $item){
echo $item->job1;
echo '<br>';
echo $item->job2;
echo '<br>';
echo $item->job3;
}

 

4.3、通过星号(*)查询元素内容

$M
						= simplexml_load_file('demo.xml');
$arr = $M->xpath('//job/*');
foreach($arr as $item){
echo $item;
echo '<hr/>';
}

 

4.4、通过[]查询

$M = simplexml_load_file('demo.xml');
$arr = $M->xpath('//job[title="
产品经理"]');
foreach($arr as $item){
echo $item->title;
echo '<hr/>';
}

 

语法说明:xpath(//nodeNmae[index])

参数说明:index为索引,在xpath中索引从1开始。

在[]查询中我们可以使用 < > = 来获相应的元素。

4.5、通过[@id]来查询满足条件的元素

获取有id属性的元素。

$M = simplexml_load_file('demo.xml');
$arr = $M->xpath('//job[@id]');
foreach($arr as $item){
echo $item->title;
echo '<hr/>';
}

 

  1. 天气预报功能(数据传输)

 

地址:http://developer.baidu.com/map/

http://developer.baidu.com/map/index.php?title=car/api/weather

http://api.map.baidu.com/telematics/v3/weather?location=%E5%B9%BF%E5%B7%9E&output=xml&ak=etMu685CaL7cdtC2Ab6TkILU

 

//将数据保存到本地
if(!is_file('weather.xml')){
$ak = 'etMu685CaL7cdtC2Ab6TkILU';
$city = '
广州';
$url = "http://api.map.baidu.com/telematics/v3/weather?location={$city}&output=xml&ak={$ak}";
$data = file_get_contents($url);
file_put_contents('weather.xml',$data);
}
//
读取本地缓存数据
$cache = file_get_contents('weather.xml');

//
解析缓存xml数据
$M = new DOMDocument('1.0','utf-8');
$M->load('weather.xml');
$currentCity = $M->getElementsByTagName("currentCity")->item(0)->nodeValue;
$date = $M->getElementsByTagName("date")->item(0)->nodeValue;
$weather = $M->getElementsByTagName("weather")->item(0)->nodeValue;
$dayPictureUrl = $M->getElementsByTagName("dayPictureUrl")->item(0)->nodeValue;
$nightPictureUrl = $M->getElementsByTagName("nightPictureUrl")->item(0)->nodeValue;
echo '
当前城市:'.$currentCity;
echo '<hr/>';
echo '
实时温度:'.$date;
echo '<hr/>';
echo '
天气情况:'.$weather."<img src='{$dayPictureUrl}'>"."<img src='{$nightPictureUrl}'>";
echo '<hr/>';

 

推荐阅读