PHP之AJAX,XML,JSON一揽子方案

PHP进阶Ajax,使用,Ajax发送get ,post请求,ajax操作xml,无刷新分页,取消缓存
一.什么是ajax
        Asynchronous  Javascript And  XML
        异步javascript 和xml 是一种可以与服务器进行(异步/同步)交互的一种浏览器的技术
    Ajax的作用      
        使用 ajax 的过程就是创建一个 ajax 对象,对象调用本身成员属性、成员方法的过程。
        优点:节省带宽,节省用户等待时间,用户体验好
    Ajax的特点: 局部刷新, 逐步加载
二.ajax使用
1. 创建ajax对象(xml核心技术)---主流浏览器方式
var xhr = new XMLHttpRequest(); 火狐、 google 、苹果 safari opera 包括 IE7 以上版本的浏览器
2、Ajax的核心对象:XMLHttpRequest
        属性: readyState//ajax对象的状态
                0:ajax对象已创建
                1: 已调用open方法
                2:已调用send方法
                3:返回部分数据
                4:返回所有数据
            responseText: 返回值(字符串)
            responseXML: 返回XML DOM对象
status服务器返回的状态码200,304,403,404,500
statusText服务器返回的状态文本信息
        方法成员
            abort()//停止当前请求
            open('get|post,url,[true,false]') 创建一个http请求
             send('get',null)或send('post',data);  请求执行
            setRequestHeader()
            onreadystatechange()事件属性
浏览器可以接收的信息 ajax 都可以接收 ,例如字符串、 html 标签、 css 样式内容、 xml 内容、 json 内容等等。
    <script type="text/javascript">
        function f1(){//ajax对服务器端发起请求
            //1创建ajax对象
            var xhr=new XMLHttpRequest();
            //4设置事件,感知readState的状态变化,进而获得服务器返回信息
            xhr.onreadystatechange=function(){
                if (xhr.readyState==4) {
                    document.write(xhr.responseText);
                }
            }
            //2创建一个新的http协议(请求)(打开浏览器、输入网址)
            //xhr.open(请求方式get/post,url地址[,同步false/异步true]);
            xhr.open('get','./Aptest.php?'+Math.random());
            //3把http请求给发送出去
            //xhr.send(null/post方式传送给服务器的数据)
            xhr.send(null);
        }
    </script>
<body>
    <h2>ajax对服务器发起请求和接收服务器返回信息</h2>
    <input type="button" value="触发" οnclick="f1()">
</body>
3、Ajax发送GET请求的步骤
    1. 创建Ajax对象: new XMLHttpRequest
    2. 初始化Ajax对象: open()
    3. 发送请求: send()
    4. 判断状态,处理数据: onreadystatechange    readyState==4
4、Ajax发送POST请求的步骤
    1. 创建Ajax对象: new XMLHttpRequest
    2. 初始化Ajax对象: open()
    3. 设置请求头信息: setRequestHeader()
            content-type, application/x-www-form-urlencoded
例:xhr.setRequestHeader("content-type","application/x-www-form-urlencoded");
    4. 发送请求: send
    5. 判断状态, 处理数据: onreadystatechange       readyState==4
<script type="text/javascript">
        function checkname(){
            //ajax方式校验用户名 ,//A. 获得被校验的用户名信息
            var nm = document.getElementById('username').value;
            //对 & 、= 等符号需要进行特殊处理,否则产生歧义
            nm = encodeURIComponent(nm);//encodeURIComponent()可以对特殊符号进行处理
            //把需要传递的信息变为"请求字符串"格式,并设置为send()方法参数
            var info = "name="+nm+"&age=20";
            //B. ajax带着该名字信息去服务器端校验
            var xhr = new XMLHttpRequest();//一
            xhr.onreadystatechange = function(){//五
                if(xhr.readyState==4){
                    alert(xhr.responseText);
                }
            }
            //post方式传递数据是模拟form表单方式传递数据
            //form表单的数据实际是组织为xml格式传递给服务器端的
            xhr.open('post','./06.php?color=red');//二
            //设置http头协议,把传递的post //数据组织为xml格式
            //注意:setRequestHeader方法必须在open方法后边调用
            xhr.setRequestHeader("content-type","application/x-www-form-urlencoded");//三
            xhr.send(info);//四
        }
</script>

三、发送带参数的请求
    GET请求: 参数写在URL地址后面。2k,安全性低,地址栏提交
    POST请求: 参数单独组织,通过send方法发送。数据大小理论无限制,安全性更高,form表单提交方式
ajaxget请求需要注意的两个地方:  
①在 url 地址后边以 请求字符串 ( 传递的 get 参数信息 ) 形式传递数据。
  中文 = & 等特殊符号处理
= & 符号在浏览器里边会与请求字符串的关键符号有混淆,避免歧义产生需要对其进行编码 .
对特殊信息的处理:
在浏览器的地址栏里边传递一些特殊符号信息,会被误解,例如  &  =   空格    中文 等。
①.在 php 里边可以函数  urlencode()/urldecode() 对特殊符号进行编码、反编码处理
(url_encode() 可以把中文转变为浏览器可以识别的信息。转变之后的信息具体为 % 号后接两个十六进制数 )
②.在 javascript 里边可以通过 encodeURIComponent () 对特殊符号等信息进行编码。
( 经过以上 红色 函数编码的内容在服务器端可以正常接收,不需要反编码 )
四、无刷新分页(详见例)
什么时候使用同步请求?
ajax 绝大多数情况下进行 异步 请求,但是有的时候也要使用“同步请求” ( 其不能被取代 ) 。例如页面有两部分内容, ajax 请求内容 正常的 html 内容输出 ,如果 html 的输出内容包括 ajax 请求的内容,就需要使得 ajax 请求完成了再进行 html 内容的输出,这样就要设置两者一前一后调用 ( 而非同时调用 ) ,既要进行 同步请求
    1、分页原理
        通过不同的url将页面参数解析成对应的SQL语句
            1.1、limit offset, num
             1.2、 (current_page -1) * page_size = offset
                1.2.1、current_page: 当前的页码
                 1.2.2、 page_size: 每页显示的数目
                 1.2.3、 offset:偏移量
                 1.2.4、 page_size == num
    2、Ajax端
        发送带页面参数的GET请求
    3、PHP端
        根据页面参数解析SQL语句
        修改分页链接
五、ajax操作xml
    ajax负责请求xml  dom操作xml,详见 天气预报案例5.1
     xml数据接收处理:getElementByTagName(),childNodes,length,tagName,nodeValue,nodeType
六、ajax缓存(针对IE浏览器)
    添加随机数xhr.open('get',',/10.php?'+Math.random());   
    设置header头//三条header语句是为兼容
header("Cache-Control:no-cache");
header("Pragma:no-cache");
header("Expires:-1");
5.1ajax+js实现xml的接收和处理(天气预报案例)
<script type="text/javascript">
        function f1(){
            //ajax请求xml信息回来 ,//dom处理xml信息(dom方式对xml的处理与html处理完全一致)
            var xhr = new XMLHttpRequest();
            xhr.onreadystatechange = function(){
                if(xhr.readyState==4){
                    //alert(typeof xhr.responseText); //以“字符串”形式返回xml信息
                    //以“xmldocment文档节点对象”形式返回xml信息,进而可以通过dom方式处理xml
                    //alert(typeof xhr.responseXML);// xml根节点的父级节点对象
                    //console.log(xhr.responseXML);//xmlDocument
                    var xmldom = xhr.responseXML;
                    //console.log(xmldom.firstChild);//<weather>
                    var citys = xmldom.getElementsByTagName('city');//三个city
                    //console.log(citys);//HTMLCollection[city, city, city]
                    //遍历当前citys[1]的"元素节点"对象
                    //getElementsByTagName()方法可以被“document”或“元素节点”对象调用
                    //for(var k in citys[1]){
                    //    console.log(k);
                    //}
                    var s = "";
                    for(var i=0; i<citys.length; i++){
                        var nm = citys[i].getElementsByTagName('name')[0].firstChild.nodeValue;
                        var tp = citys[i].getElementsByTagName('temp')[0].firstChild.nodeValue;
                        var wd = citys[i].getElementsByTagName('wind')[0].firstChild.nodeValue;
                        s += "城市:"+nm+"-温度:"+tp+"-风向:"+wd+"<br />";
                    }
                    document.getElementById('result').innerHTML = s;
                }
            }
            xhr.open('get','./09-weather.xml');
            xhr.send(null);
        }
        </script>
<body>
        <h2>ajax+js实现xml的接收和处理</h2>
        <input type="button" value="触发" οnclick="f1()" />
        <div id="result"></div>
    </body>
<weather>
    <city>
        <name>北京</name>
        <temp>15~20</temp>
        <wind>北风</wind>
    </city>
    <city>
        <name>上海</name>
        <temp>18~22</temp>
        <wind>海风</wind>
    </city>
    <city>
        <name>深圳</name>
        <temp>19~25</temp>
        <wind>南风</wind>
    </city>
</weather>
PHP进阶-Ajax-Json,jQuery封装的ajax,无刷新提交表单文件进度条,地市三级联动
 json: java script  object  notation(javascript对象符号)
其是一种数据交换格式 ( 之前的 xml 也是数据交换格式 )
一、使用XML的方式传输数据
    通过responseXML返回DOM对象
    调用getElementsByTagName获取节点信息
    注意:需要找到文本节点         对于文本节点可以通过nodeValue访问
二、使用JSON的方式传输数据
    2.1 JSON格式的组织形式:“键-值”对 name:value,使用{}表示一个json对象,使用[]表示json对象数组
jsonjavascript里边就是字面量对象  var obj = {名称:值,名称:值,名称:function(){}}
var customer={firstName:'John',lastName:'Doe'};以上赋值语句的右边是一个对象字面量(object literal)。
对象字面量是一个名值对列表,每个名值对之间用逗号分隔,并用一个大括号括起。各名值对表示对象的一个属性,名和值这两部分之间用一个冒号分隔。 在编程语言中,字面量是一种表示值的记法。
JSON和XML一样也是一种简单文本格式。相对于XML,JSON更加易读、更便于肉眼检查。
在语法的层面上,JSON与其他格式的区别是在于分隔数据的字符,JSON中的分隔符限于单引号'、小括号()、中括号[]、大括号{}、冒号:和逗号,
    2.2 PHP解析JSON
        json_encode      将数组/对象转换成json对象
               json_encode(关联数组/索引关联数组/对象)---》json对象,json_encode(索引数组)---》json数组
        json_decode
            反编码json,返回数组或对象,默认false对象
     json_decode(json,true)--->array, json_decode(json,false)--->object
    2.3 JS解析JSON
        通过 eval()将字符串变成JSON对象,或者.符号直接当数组用
    $color=array('red','blue','green');
    echo json_encode($color);echo "<hr>";//1索引数组--》json数组
    $city=array('liaoning' => 'shenyang', 'zhejiang' => 'hangzhou','qinghai' => 'qinghaihu');
    echo json_encode($city);echo "<hr>";//2关联数组--》json对象
    $city2=array('liaoning' => 'shenyang', 'zhejiang' => 'hangzhou','beijing','青海' => '青海湖','yichun');
    echo json_encode($city2);echo "<hr>";//3索引关联数组--》json对象
    class Person{
        var $name="tom";
        var $height="170";
        function run(){
            echo $this>name."在跑步";
        }
    }
    $pers=new Person();
    echo json_encode($pers);echo "<hr>";//4对象json_encode--》json对象
    $xinxi=array('name' => '张三','addr' => '浙江','年龄' => 20,'未婚','博士');
    $jn_xinxi=json_encode($xinxi,JSON_UNESCAPED_UNICODE);
    echo $jn_xinxi;echo "<hr>";//5中文\u加两十六进制,但加该参数可正常显示
    $fan_xinxi=json_decode($jn_xinxi,true);
    var_dump($fan_xinxi);//6返回数组或对象,默认false对象
结果:1---------------------------------------------------------------------------------------------
["red","blue","green"]
2--------------------------------------------------------------------------------------
{"liaoning":"shenyang","zhejiang":"hangzhou","qinghai":"qinghaihu"}
3--------------------------------------------------------------------------------------
{"liaoning":"shenyang","zhejiang":"hangzhou","0":"beijing","\u9752\u6d77":"\u9752\u6d77\u6e56","1":"yichun"}
4--------------------------------------------------------------------------------------
{"name":"tom","height":"170"}
5--------------------------------------------------------------------------------------
{"name":"张三","addr":"浙江","年龄":20,"0":"未婚","1":"博士"}
6--------------------------------------------------------------------------------------
array(5) { ["name"]=> string(6) "张三" ["addr"]=> string(6) "浙江" ["年龄"]=> int(20) [0]=> string(6) "未婚" [1]=> string(6) "博士" }
三、无刷新表单,详见示例345
    使用FormData对象接收表单数据(是h5新技术) 普通表单域 上传文件域 均可以收集。几个注意事项
var fd = new FormData(this);  //1表单的 全部信息已经收集给fd存储了
//2使用FormData的时候,不用使用setRequestHeader()方法
xhr.send(fd); //3post提交表单信息
evt.preventDefault();//4使用事件方法阻止表单form数据提交动作
四、无刷新上传,详见示例345
    使用FormData对象接收表单数据
    进度条的实现
        通过upload对象的
            onprogress事件
                loaded     已经上传文件
                total        总文件大小
五、jQuery封装的ajax的使用,详见示例345
    5.1      $.get(url[,data][,function(msg){}回调函数][, dataType]);
        url             请求地址
        data             数据参数, 给服务器传递的数据,请求字符串 json 对象 都可以设置
        callback             回调函数,完成ajax后续处理, msg 泛指从服务器传递回来数据信息的变量
        dataType :服务器返回数据类型, html text xml json
    5.2      $.post(url[,data][,fn回调函数][, dataType]);
        url             请求地址
        data          数据参数
        callback       回调函数
        dataType     返回数据类型
4.10 21:55 //此处插播一条注意事项
项目第14次提交
1短信验证码功能
BUG:短信验证码这里卡了4.8个小时,短信可接收,但短信发送状态不显示
原因:Ajax接收返回的数据不正确,多返回了Sending TemplateSMS to $to <br/>{ status="100"}
解决:修改function()里function sendSms($to,$datas,$tempId='1'){}函数
将echo "Sending TemplateSMS to $to <br/>";注释掉后正确返回{"status":"101"}
注意:以后使用Ajax返回的数据只能纯json,并 注意调用接口时有没有返回接口函数中的无关数据
    5.3     $.ajax-----详见示例5.1地市三级联动
$.ajax({  //json对象
       url:请求地址,
       [data]:给服务器传递的数据(请求字符串/json对象 ),必须键值对,注意{}外无“”,否则是字符串。
       [dataType]:默认字符串返回信息格式,数据从服务器返回格式htmltextxmljson
       [type]:[get]/post请求方式
       [success]:function(msg){}  ajax成功请求后的回调函数,可以做后续处理使用
         其中msg泛指服务器返回来的信息,相当于readyState==4的处理逻辑函数部分
       async:[true]异步/false同步,
       cache:[true]缓存/false不缓存,
});
注意:其中data2种传参方式1是json格式,2是请求字符串形式
1data: { "orderId" :orderId, "commant" :commant},2 data: "orderId=" + orderId + "&commant=" + commant
示例345:Ajax无刷新表单提交+附件上传+进度条显示
<script type="text/javascript">
        window.οnlοad=function(){
            var fm=document.getElementsByTagName('form')[0];
            fm.οnsubmit=function(evt){
                //1dom收集表单信息,利用FormData,this:在普通事件内部代表事件元素节点对象本身
                var fd=new FormData(this);//表单的全部信息已经收集给fd存储
                //2ajax传递收集的信息
                var xhr=new XMLHttpRequest();
                xhr.upload.οnprοgress=function(evt){
                    var total=evt.total;//已经上传文件大小
                    var loaded=evt.loaded;//附件总大小
                    var per=Math.floor((loaded/total)*100);//上传百分比
                    document.getElementById('du').innerHTML=per+"%";
                    document.getElementById('du').style.width=per+"%";
                }
                xhr.onreadystatechange=function(){
                    if (xhr.readyState==4) {
                        alert(xhr.responseText);
                    }
                }
                xhr.open('post','./json1.php');
                //使用FormData的时候,不用使用setRequestHeader()方法
                // xhr.setRequestHeader('content-type','application/x-www-form-urlencoded');
                xhr.send(fd);
                evt.preventDefault();//阻止form表单的提交动作
                }
        }
    </script>
<style type="text/css">
        #jin{width:700px;height: 50px;border: 1px solid blue;}
        #du{width:0;height:100%;background-color: green;}
</style>
<body>
    <form method="post" action="./json1.php">//可以直接写成<form>
        <p>名字<input type="text" id="username" name="mingzi"></p>
        <p>密码<input type="password" id="pass" name="mima"></p>
        <p>邮箱<input type="text" id="email" name="youxiang"></p>
        <p>文件<input type="file" id="file" name="tupian"></p>
        <div id="jin"><div id="du"></div></div>
        <p><input type="submit" value="zhuce"></p>
    </form>
</body>
PHP接收和处理表单提交信息
    print_r($_POST);
    print_r($_FILES);
    $dir="./upload/";
    $ext=substr($_FILES['tupian']['name'],strrpos($_FILES['tupian']['name'],'.'));
    $name=date("YmdHis").'-'.mt_rand(1000,9999);
    $dir_name=$dir.$name.$ext;
    // echo $dir_name;
    if ( move_uploaded_file($_FILES['tupian']['tmp_name'],$dir_name)){
        echo "Success";
    }else{
        echo "Fail";
    }
5.1地市三级联动
<title>三级联动</title>
    <script type="text/javascript" src="./jquery-1.4.4.js"></script>//引入jQuery文件
    <script type="text/javascript">
        var xmlobj; //声明全局变量
        $.ajax({
            url:'./ChinaArea.xml', //解析xml文件
            type:'get',
            dateType:'xml',
            success:function(msg){
                xmlobj=msg;
                showprovince(); //引入成功后执行显示省份函数
            }
        });
        // window.οnlοad=function(){//javascript加载方法
        //     $.ajax({
        //         url:'./ChinaArea.xml',
        //         type:'get',
        //         dateType:'xml',
        //         success:function(msg){
        //             xmlobj=msg;
        //             showprovince();
        //         }
        //     });
        // ;}
        // $(function(){//jQuery加载方法
            // ajax代码
        // });
        function showprovince(){ // 获得全部省份的province元素节点,并遍历获得具体省份信息
            $(xmlobj).find('province').each(function(){
                var prova=$(this).attr('province');
                var proid=$(this).attr('provinceID');
                $('#province').append("<option value='"+proid+"'>"+prova+"</option>");//遍历赋值
            });
        }
        function showcity(){     //根据选取的省份显示对应的城市信息
            //获得被选中省份的id值 //根据pid获得对应的省份元素节点对象,进而获得其内部的City城市节点
            var pid=$('#province option:selected').val();        
            var citys=$(xmlobj).find("[provinceID="+pid+"]").find('City');
            $('#city').empty();
            $('#area').empty();//先清空
            citys.each(function(){//遍历citys并显示城市信息
                var citva=$(this).attr('City');//this:分别依次代表每个city的dom对象
                var citid=$(this).attr('CityID');
                $('#city').append("<option value='"+citid+"'>"+citva+"</option>");
            });
        }
        function showarea(){     //获得地区信息
            var cid=$('#city option:selected').val();
            var areas=$(xmlobj).find("[CityID="+cid+"]").find('Piecearea');   
            $('#area').empty();       
            areas.each(function(){
                var areava=$(this).attr('Piecearea');
                var areaid=$(this).attr('PieceareaID');
                $('#area').append("<option value='"+areaid+"'>"+areava+"</option>");
            });
        }
    </script>

<body>
    <h2>地市三级联动</h2>
    省份:<select id='province' οnchange="showcity()"><option>---</option></select>
    城市:<select id='city' οnchange="showarea()"><option>---</option></select>
    区县:<select id='area'><option>---</option></select>
</body>
XML、 SimpleXML 、xpath RSS简介
XML: extensible  markup  language (可扩展标记语言)
一个网站会给其他一些网站提供接口数据, 这些数据过来的时候需要被组织为一定的 格式 ,该格式可以是 xml (json)
XML 类似于 HTML ,也是一种标记语言, XML 的设计宗旨是为了 传输 数据,而 不是显示 数据
一、xmlhtml的区别和联系
1、联系:它们都是标签语言
区别:① 侧重点
xml侧重数据的传输、数据的存储
html侧重数据的表现
② 标签自我描述性
xml可以根据自己的想法,自定义使用的标签
html需要使用一些固定标签(table div span等等)
③ 标签和表现是否分离
xml标签和表现是分离的
html标签和表现是在一起的,例如h1  h2  h3  p 等标签在使用的时候会表现出一定的“样式”
2、作用配置文件 小型数据库 xml 被设计为 office excel(2007 版本 ) 办公文档 ,
数据接口---网站服务器--->数据接口-天气、微信、视频等(格式为XML)--->其他网站php,java,C#
其他作用:存储数据库。 结构化文档。 存储矢量图形 描述多媒体演示 定义通道。 描述软件包及其依赖的软件……
<?xml version="1.0" encoding="UTF-8"?>
<students>
    <student1>
        <name  sex="female">李华</name>
        <age>20</age>
        <地址>福州</地址>
        <descript><![CDATA[李华“很靓”,用'自己'的<才华>建设班级&英语角!]]></descript>
    </student1>
</students>
3、xml语法,特点:xml语法规则严格,但简单赋予逻辑   
1.必须有标记头且顶头写前面不能有空格或其他<?xml version="1.0" encoding="UTF-8"?>
2.必须有且只有一个根节点
3.元素都必须有关闭标签
4.标签元素大小写敏感,前后标签大小写必须一致
5.标签可以嵌套但不可以交叉
6.元素属性必须有值且值必须加引 号
7.特殊符号必须使用实体
8.大量特殊符号使用<![CDATA[ 内容 ]]>节
补充:xml空格会被保留,一个空格就会占一个空位
土豆案例:
二、相关函数
strrchr():函数查找字符串在另一个字符串中最后一次出现的位置,并返回 从该位置到字符串 结尾的所有字符
     例:$a = “xiaoming@163.com@sohu.com”;      echo strrchr($a,’@’);   //@sohu.com
srt_replace($search,$replace,$str) 函数以其他字符替换字符串中的一些字符(区分大小写)
file_get_contents()---可作爬虫
1、 file_get_contents(本地文件) 打开一个本地文件
2、 file_get_contents(url地址) 对一个url地址发起请求,并返回请求信息(浏览器显示的信息) 
file_put_contents():将字符串写入一个文件,第一个参数文件名,第二个参数要写入的字符串,
与依次调用 fopen(),fwrite() 以及 fclose()效果相同。
三. SimpleXML 操作 xml
1、具体使用 simplexml, xml 进行处理的技术有:
simplexml ,对 xml 进行 增、删、改、查 操作
DOM 最强大的, 增、删、改、查 都可以
xpath 技术,专门进行 xml 查询 操作
2、simplexml的使用步骤:
引入xml 信息(两种方法)---着重记忆
$sim = simplexml_load_file(xml文件);将xml文件转为对象
$sim = simplexml_load_string(xml字符串);将xml文档转为对象
以上两行代码, $sim 都是对象返回,具体是 SimpleXMLElement
利用 $sim 调用获得各个标签包含的信息,例如 <student> 奥巴马 </student> ,获取奥巴马内容
返回的信息是一个 Object 对象,因此需要做 (string) 数据类型转换
echo (string) $sim-> 标签 1-> 标签 2-> 标签 3, 其中标签1xml第二层标签, 各个标签出现同名称情况,需要通过 [ 下标 ] 方式进行区分
     例如 $sim-> 标签 [2]-> 标签,下标是从 0 开始计数,如果都没有设置下标,则会直接取同级的第一个标签
利用$sim获得属性信息--- $sim -> 标签 -> 标签 ->attributes()-> 属性名称
保存设置好的xml
a. 浏览器直接输出 xml: header(‘content-type:text/xml;charset=utf-8’);      echo $sim -> asXML();
b. xml 保存到一个文件里边 $sim -> asXML(file 文件 );
3、simplexml使用操作
    1添加
        addChild(名称,[值]) 追加子节点,无值则创建新空节点
        addAttribute(名称,值):添加属性,值必须写
        asXML()有参数生成文件,无参数直接输出,参数是文件名
    2修改 ---重新赋值 $xml->student[2]->name=莉莉'
    3删除 --- unset( $xml->student[2]->name) 
    4获取 ---类似对象取值 $xml->student[2]->name
四、Xpath简介及使用
    Xpath是帮助我们通过类似定义“路径”的方式非常快速地获取xml中指定的节点信息的语言。
    Xpath定义 路径有两种风格
        从xml根节点开始获取: $path = “ /name/name/name/name”; 
        从xml的第二层节点开始获取:$path = “name/name/name”;   
    限制条件获取
        对指定元素的属性 '@名称’
 1、 通过元素[名称=值]限制查找对象
     ①  student/name[@city] : 获得 student元素内部的name元素,并且要求name元素有city 属性
②   student/name[@xueli='本科'] : 获得 student元素内部的name元素,并且要求name元素有xueli ='本科 '的属性
  student/name/@xueli : 获得 student元素内部的name元素的xueli属性
 student/name/@* : 获得 student元素内部的name 元素的所有属性   
⑤  student[hobby]/ height: 获得 student元素内部的height元素,要求该student 元素内部有  < hobby>元素  
⑥  student[name='奥巴马']/color : 获得 student元素内部的color元素,并且要求student 元素内部有  < name>奥巴马</name>元素
2、xpath的使用的步骤:
引入 xml 并创建 simplexmlelement 对象        $sm = simplexml_load_file('01.xml');
定义 xpath 路径 $path = "/students/student[1]/color";//student元素下标从1开始
simplexmlelement 解析处理路径获得数组节点对象 $cl = $sm -> xpath($path);
获得具体元素信息 echo (string)$cl[0]."<br />";   //white
<?xml version="1.0" encoding="UTF-8"?>
<students>
    <student>
        <name sex="female">李华</name>
        <age>20</age>
        <地址>福州</地址>
        <descript><![CDATA[李华“很靓”,用'自己'的<才华>建设班级&英语角&]]></descript>
        <embed src="http://player.youku.com/player.php/sid/XMTg2OTkxNzQ5Ng==/v.swf" allowFullScreen="true" quality="high" width="480" height="400" align="middle" allowScriptAccess="always" type="application/x-shockwave-flash"/>
    </student>
    <student>
        <name sex="female" school="大学">莉莉</name>
        <age>21</age>
        <hobby>羽毛球</hobby>
    </student>
</students>

<?php
 // $sm=simplexml_load_file("testx.xml");//引入xml文件方法1,获取xml对象
    $xml_string=file_get_contents("testx.xml"); //引入xml文件方法2-1
    var_dump($xml_string);
    $xmlobj=simplexml_load_string("$xml_string");//引入xml文件方法2-2,获取xml对象
    echo "<pre>";
    print_r($xmlobj);
    echo "<hr>";
    // $name=$xmlobj->student[0]->name;//李华----获取xml的值
    $name=$xmlobj->student[0]->embed->attributes()->src;//female---获取xml属性
    var_dump($name);
    echo "<hr>";
    $sm=simplexml_load_file('testx.xml');
    // $st=$sm->addChild('student');//添加第二个student二层节点信息
    // $nm=$st->addChild('name','小雷'); //添加名字
    // $nm->addAttribute('sex','male');  //添加名字的属性sex
    // $st->addChild('age',21);          //添加年龄信息
    // $sm->asXML('testx.xml');     //保存xml到testx.xml文件
    $sm->student[1]->name='莉莉';   //修改第二个节点的名字信息
    $sm->student[1]->name->attributes()->sex='female';//修改第二个节点的sex属性
    $sm->student[1]->name->addAttribute('school','大学');//添加一个属性
    echo $sm->asXML('testx.xml');//必须对修改的数据保存
    // echo $xmlobj->asXML('testx.xml');//必须对修改的数据保存
    // $path="/students/student[2]/name";//从xml根节点开始获取路径
    // $path="/students/student[2]/name/@school";//对指定元素的属性”@名称” 进行查找
    $path="student[hobby]/name";//从xml的第二层节点开始获取,并且student里边还有一个hobby元素
    $co=$sm->xpath($path);//解析处理路径获得数组节点对象
    var_dump($co);
    echo (string)$co[0];echo "<hr>";//莉莉
?>
五、在线英语词典 ---业务逻辑
        1.form表单提交单词
        2.post判断是否有数据提交,有则执行无则结束
        3.simplexml_load_file()引入词典文档 $sm = simplexml_load_file('01.xml');      $path = "/students/student[1]/color";
        4.存在单词, simplexmlelement 解析处理路径获得数组节点对象 ,xpath获取单词信息及例句 $cl = $sm -> xpath($path);
        5.单词信息展示
<?php //先将dict.xml放到同一目录下
    header('Content-type:text/html;charset=utf-8');   
    if (!empty($_POST)) {//2.post判断是否有数据提交,有则执行无则结束
        $fword=$_POST['danci'];
        $xobj=simplexml_load_file('dict.xml');//3.simplexml_load_file()引入词典文档,通过xpath查找单词
        $meanPath="word[name='$fword']/mean";
        $lxPath="word[name='$fword']/lx";//4.存在单词,通过xpath获取单词信息及例句
        $mp=$xobj->xpath($meanPath);
        $lp=$xobj->xpath($lxPath);
        // var_dump($wp);
        $lp=(string)$lp[0];
        $lp=str_replace('/r/n', '<br/>', $lp);
//5.单词信息展示
        echo "<p>单词:<br/>$fword</p>";
        echo "<p>译文:<br/>$mp[0]</p>";//注意是数组需要指定下标
        echo "<p>例句:<br/>$lp</p>";
    }else{
        echo "请输入单词";
    }
    // var_dump($_POST);
?>
<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
    <h2>英文翻译</h2>
    <form action="" method="POST">//1.form表单提交单词
        <p>输入英文:<input type="text" name="danci"></p>
        <p><input type="submit" name="翻译"></p>
    </form>
</body>
</html>
单词:good
译文:
n. 善行,好处
a. 好的,优良的,上等的
[pl.]商品
例句:
Smoking is not good for your health.
吸烟对你的健康没有好处。

六、Rss简介及制作
1、Rss简介:简易信息聚合(也叫聚合内容)是一种基于XML标准,在互联网上被广泛采用的内容包装和投递协议;
    Rss优点:定时更新订阅信息,除去不必要的广告,节省时间
    应用场景:各种订阅
2. 制作自己的rss---rss订阅更新是根据 link进行判断;
RSS 本质就是 xml 文档而已,该 xml 文档的编辑设计需要符合 RSS 格式 (RSS 是一种特殊格式的 xml)
Rss是一种特殊格式的xml,拥有固定的xml格式;详细见Rss_dome.php
具体为有以下标签出现的 xml 文档就可以构成为 rss 订阅器
< rss version ="2.0">
< channel >
    < title ></ title >                                        //rss 标题名称
    < link ></ link >                                        // 链接地址
    < description ></ description >                   // 描述
    < item >                                          // 每条新闻
        < title ></ title >                      // 标题
        < link ></ link >                      // 链接
        < author ></ author >                     // 作者
        < pubDate ></ pubDate >         // 发布时间
        < description ></ description > // 描述
    </ item >
    ...item 单元标签重复出现即可
</ channel >
</ rss >
rss 就是在服务器里边有一个“请求地址”,用户访问该地址的时候,会呈现 xml(rss) 新闻列表内容而已http://localhost/03_myrss.xml




  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值