• 332 ajax数据交互 之 XML


    浏览器端只是负责用户的交互和数据的收集以及展示,真正的数据都是存储在服务器端的。我们现在通过ajax的确可以返回一些简单的数据(一个字符串),但是在实际开发过程中,肯定会会设计到大量的复杂类型的数据传输,比如数组、对象等,但是每个编程语言的语法都不一样。因此我们会采用通过的数据交换格式(XML、JSON)来进行数据的交互。


    XML

    什么是XML

    • XML 指可扩展标记语言(EXtensible Markup Language)
    • XML 是一种标记语言,很类似 HTML
    • XML 的设计宗旨是传输数据,而非显示数据
    • XML 标签没有被预定义。您需要自行定义标签。

    语法规范

    • 第一行必须是版本信息
    • 必须有一个根元素(有且仅有一个)
    • 标签不可有空格、不可以数字或.开头、大小写敏感
    • 不可交叉嵌套,都是双标签,如果是单标签,必须闭合
    • 属性双引号(浏览器自动修正成双引号了)
    • 特殊符号要使用实体
    • 注释和HTML一样

    xml解析

    1、后台需要设置

    告诉浏览器,返回的 文件格式是xml,及编码格式

    header('content-type:text/xml;charset=utf-8');

    2、前端获取

    xhr.responseXML 来获取,得到是一个dom对象,

    取值: 剥洋葱, 一直获取子元素,直到取值位置 dom操作!

    3、缺点:虽然可以描述和传输复杂数据,但是其解析过于复杂并且体积较大,所以实现开发已经很少使用了。


    <students>
        <student>
            <name>张三</name>
            <age>18</age>
            <gender>男</gender>
            <desc>路人甲</desc>
        </student>
        <student>
            <name>李四</name>
            <age>20</age>
            <gender>男</gender>
            <desc>路人乙</desc>
        </student>
    </students>
    

    php获取xml文件的内容

    //注意,如果需要返回xml数据,需要把content-type改成text/xml,不然浏览器以text/html进行解析。
    header('content-type:text/xml;charset=utf-8');
    //用于获取文件的内容
    //参数:文件的路径
    $result = file_get_contents("data.xml");
    echo $result;
    

    html解析xml

    //获取服务端返回的xml数据,需要使用xhr.responseXML,这是一个document对象,可以使用DOM中的方法查找元素。
    var data = xhr.responseXML;
    //获取所有的学生
    var students = data.querySelectorAll("student");
    

    案例

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <link rel="stylesheet" href="../table.css">
    </head>
    
    <body>
        <button>获取数据</button>
        <table>
            <!-- 动态渲染 -->
        </table>
    
        <script>
            // 1- 点击按钮,向后台发送请求,获取明星数据
            // 2- 把后他返回的xml数据,动态渲染在页面中
            document.querySelector('button').onclick = function() {
                //1-创建一个XMLHttpRequest对象
                var xhr = new XMLHttpRequest();
    
                //2-设置请求报文
                //2-1请求行
                xhr.open('get', './star.php');
                //2-2请求头
                //2-3请求主体
                xhr.send(null);
    
                //3-监听服务器响应
                xhr.onreadystatechange = function() {
                    if (xhr.readyState == 4 && xhr.status == 200) {
                        // var r = xhr.responseText; //获取响应文本,以字符串形式获取
                        var r = xhr.responseXML; //获取后台返回xml数据
                        console.log(r);
                        //每个item中存储的是一个人的信息
                        var items = r.querySelectorAll('item');
                        console.log(items);
                        // 遍历items,每个item要生成表格一行
    
                        var str = ''; //用于存储生成表格结构
    
                        for (var i = 0; i < items.length; i++) {
                            console.dir(items[i].querySelector('name').innerHTML);
                            //获取当前遍历人的信息
                            var name = items[i].querySelector('name').innerHTML;
                            var age = items[i].querySelector('age').innerHTML;
                            var sex = items[i].querySelector('sex').innerHTML;
                            var photo = items[i].querySelector('photo').innerHTML;
                            var album = items[i].querySelector('album').innerHTML;
    
                            //把一个人信息拼成表格的一行
                            str += '<tr>';
                            str += '<td>' + name + '</td>';
                            str += '<td>' + age + '</td>';
                            str += '<td>' + sex + '</td>';
                            str += '<td>' + photo + '</td>';
                            str += '<td>' + album + '</td>';
                            str += '</tr>';
                        }
    
                        //输出
                        console.log(str);
                        //把拼接好结构 放到页面中
                        document.querySelector('table').innerHTML = str;
                    }
                }
            }
        </script>
    </body>
    
    </html>
    

    <?php 
        // 告诉浏览器,返回的 文件格式是xml,及编码格式 【默认返回的是text/html文本字符串】【返回text/xml,前端就收到的是一个文档对象,不是字符串。】
        header('content-type:text/xml;charset=utf-8');
        // 获取star.xml中数据,返回给前端
        echo file_get_contents('./star.xml');
    ?>
    
    

    <?xml version="1.0" encoding="utf-8"?>
    <root>
    	<item>
    		<name type="star">王力宏</name>
    		<photo>./images/wlh.jpg</photo>
    		<album>&lt;&lt;改变自已&gt;&gt;</album>
    		<age>9</age>
    		<sex>男</sex>		
    	</item>
    	<item>
    		<name type="star">周杰伦</name>
    		<photo>./images/wlh.jpg</photo>
    		<album>&lt;&lt;我很忙&gt;&gt;</album>
    		<age>39</age>
    		<sex>男</sex>		
    	</item>
    	<item>
    		<name type="star">王力宏</name>
    		<photo>./images/wlh.jpg</photo>
    		<album>&lt;&lt;改变自已&gt;&gt;</album>
    		<age>39</age>
    		<sex>男</sex>		
    	</item>
    	<item>
    		<name type="star">王力宏</name>
    		<photo>./images/wlh.jpg</photo>
    		<album>&lt;&lt;改变自已&gt;&gt;</album>
    		<age>39</age>
    		<sex>男</sex>		
    	</item>
    	<item>
    		<name type="star">王力宏</name>
    		<photo>./images/wlh.jpg</photo>
    		<album>&lt;&lt;改变自已&gt;&gt;</album>
    		<age>39</age>
    		<sex>男</sex>		
    	</item>
    	<item>
    		<name type="star">王力宏</name>
    		<photo>./images/wlh.jpg</photo>
    		<album>&lt;&lt;改变自已&gt;&gt;</album>
    		<age>39</age>
    		<sex>男</sex>		
    	</item>
    	<item>
    		<name type="star">王力宏</name>
    		<photo>./images/wlh.jpg</photo>
    		<album>&lt;&lt;改变自已&gt;&gt;</album>
    		<age>39</age>
    		<sex>男</sex>		
    	</item>
    	<item>
    		<name type="star">周杰棍</name>
    		<photo>./images/wlh.jpg</photo>
    		<album>&lt;&lt;双截龙&gt;&gt;</album>
    		<age>39</age>
    		<sex>男</sex>		
    	</item>
    	<item>
    		<name type="star">王力宏</name>
    		<photo>./images/wlh.jpg</photo>
    		<album>&lt;&lt;改变自已&gt;&gt;</album>
    		<age>39</age>
    		<sex>男</sex>		
    	</item>
    	<item>
    		<name type="star">王力宏</name>
    		<photo>./images/wlh.jpg</photo>
    		<album>&lt;&lt;改变自已&gt;&gt;</album>
    		<age>39</age>
    		<sex>男</sex>		
    	</item>
    	<item>
    		<name type="star">王力宏</name>
    		<photo>./images/wlh.jpg</photo>
    		<album>&lt;&lt;改变自已&gt;&gt;</album>
    		<age>39</age>
    		<sex>男</sex>		
    	</item>
    	<item>
    		<name type="star">王力宏</name>
    		<photo>./images/wlh.jpg</photo>
    		<album>&lt;&lt;改变自已&gt;&gt;</album>
    		<age>39</age>
    		<sex>男</sex>		
    	</item>
    	<item>
    		<name type="star">周杰棍</name>
    		<photo>./images/wlh.jpg</photo>
    		<album>&lt;&lt;双截龙&gt;&gt;</album>
    		<age>39</age>
    		<sex>男</sex>		
    	</item>
    </root>
    
  • 相关阅读:
    PyQT_Group
    单例模式演示-1-39-07
    RSqlBuilder
    RExcel
    RJson
    NodeJs开发目录
    NodeJs事件驱动
    NodeJs实用工具util
    NodeJs之global,process
    NodeJs两个简单调试技巧
  • 原文地址:https://www.cnblogs.com/jianjie/p/12383712.html
Copyright © 2020-2023  润新知