Xml 学习二
使用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方法删除指定属性。
使用SimpleXML模型操作XML
初始化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方法添加新节点。
属性
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/>';
}
天气预报功能(数据传输)
地址: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/>';