美文网首页Android精选jQuery
PHP获取XML传递的数据

PHP获取XML传递的数据

作者: 饮杯梦回酒 | 来源:发表于2018-12-20 23:10 被阅读50次

    导读:

    • 首先先明确XML 是一种用于标准结构化文档交换的数据格式(另一种JSON),你可以在 XML 教程 中找到更多有关 XML 的信息。

    实现:

    • XML一般格式:
    <?xml version="1.0" encoding="UTF-8" ?>
    <root>
        <!--传递的数据-->
        <name>饮杯梦回酒</name>
        <sex>male</sex>
    </root>
    
    • 如果想在PHP文件中获取XML中的数据,可以使用file_get_contents()函数(详情),此外事先必须先利用header()函数(详情)来告诉浏览器将其按照XML文件格式解析,编写完XML和PHP文件后,在web页面处理Ajax请求的成功的回调中不再使用xhr.responseText方法获取PHP返回的数据转而使用xhr.responseXML,最终该函数会把整个文件读入到一个字符串中,通过与HTML一样的DOM操作拿数据(整体流程以上述XML文件为例):

    1.PHP获取XML数据

    <?php
      header("Content-type:application/xml"); //  还有一种是类型是:text/xml 二者本质的区别在于编码,前者采用XML中自定义的编码(推荐)
      echo file_get_contents("info.xml"); 
    ?>
    

    2.在Ajax中获取数据
    ps:这里我利用原生JS封装好了一个自己的myAjax方法(简书MarkDown不支持页内跳转,故源码放在页面底部)

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
        <script src="../myAjax-jQ.js"></script>
    </head>
    <body>
        <script type="text/javascript"> 
            window.onload = function() {
                var btn = document.getElementsByTagName("button")[0];
                btn.onclick = function() {
                    myAjax({
                        type: "GET",
                        url: "ajax-xml.php",
                        success: function(xhr) {
                            var res = xhr.responseXML; //  res打印出来就是#document(与HTML的简直一模一样)
                            console.log(res.querySelector("name").innerHTML, res.querySelector("sex").innerHTML);
                        },
                        error: function(xhr) {
                            alert(xhr.status);
                        }
                    })
                }       
            }
        </script>
        <button>发送请求</button>
    </body>
    </html>
    

    最终在浏览器得到返回结果如下:


    Result

    总结:

    • 以上就是PHP获取XML数据的核心代码,当然根据需求不同用到的方法也不尽相同,小伙伴应灵活应对(毕竟有我们万能的W3C)。
    • 附自己封装的myAjax方法:
    function obj_new(data) {
        //  防止IE7↓有Ajax缓存,所以每次请求时都动态的改变URL参数
        data.t = new Date().getTime();
        var res = [];
        for(var key in data) {
            //  URL中不能出现中文,使用encodeURIComponent方法进行转码
            res.push(encodeURIComponent(key)+"="+encodeURIComponent(data[key]));
        }
        return res.join("&");
    }
    function myAjax(option) {
        //  把传入的对象转化成URL字符串形式
        if(option.data){
            var str =  obj_new(option.data);
        }   
        var xmlhttp, timer;
        //  创建异步请求对象
        if (window.XMLHttpRequest)
        {// code for IE7+, Firefox, Chrome, Opera, Safari
            xmlhttp=new XMLHttpRequest();
        }else {// code for IE6, IE5
            xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
        }
        if(option.type.toUpperCase() == "GET") {
            xmlhttp.open(option.type, option.url+"?"+str, true);
            xmlhttp.send(); 
        } else {
            xmlhttp.open(option.type, option.url, true);
            xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            xmlhttp.send(str);
        }
    
        xmlhttp.onreadystatechange = function() {
            clearInterval(timer);
            if(xmlhttp.readyState === 4) {
                if(xmlhttp.status >= 200 && xmlhttp.status < 300 || xmlhttp.status == 304) {
                    option.success(xmlhttp);
                } else {
                    option.error(xmlhttp);
                }
            }
        }
        //  判断是否传入了超时时间
        if(option.timeout) {    
            timer = setInterval(function(){
                console.log("中断请求");
                xmlhttp.abort();
                clearInterval(timer);
            }, option.timeout)
        }
    }
    

    相关文章

      网友评论

        本文标题:PHP获取XML传递的数据

        本文链接:https://www.haomeiwen.com/subject/hboukqtx.html