• Xml 学习二


    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/>';

     

  • 相关阅读:
    Flex 布局
    前端跨域之jsonp
    vs code 自定义代码片段
    vue中使用axios进行http通信
    Table边框合并
    getElementsBy 系列方法相比querySelector系列的区别
    vue中watch简单使用
    png图标任意赋色
    pc端与移动端适配解决方案之rem
    Express post请求无法解析参数的原因
  • 原文地址:https://www.cnblogs.com/nyxd/p/5362767.html
Copyright © 2020-2023  润新知