29、XML、JSON与Ajax技术详解

XML、JSON与Ajax技术详解

1. XML相关技术

1.1 DOM与SimpleXML查找属性差异

在处理XML时,使用DOM和SimpleXML查找属性值的方式有所不同。例如,使用DOM查找 id 属性元素的代码如下:

$results = $xpath->query("dog/name[contains(., 'jade')]"); 
foreach ($results as $element) { 
    print $element->attributes->getNamedItem("id")->nodeValue; 
} 

而使用SimpleXML时,查找属性的方式为 attributes()->id

1.2 XMLReader和XMLWriter

1.2.1 特点与适用场景

XMLReader和XMLWriter通常一起使用,相较于SimpleXML或DOM扩展,它们更难使用。但对于非常大的文档,它们是很好的选择,因为它们是基于事件的,不需要将整个文档加载到内存中。不过,使用它们的前提是需要事先清楚XML的确切架构。

1.2.2 XMLReader示例

以下是使用XMLReader查找元素的示例代码:

<?php 
error_reporting(E_ALL ^ E_NOTICE); 
$xml = <<<THE_XML 
<animals> 
  <dog> 
    <name>snoopy</name> 
    <color>brown</color> 
    <breed>beagle cross</breed> 
  </dog> 
  <cat> 
    <name>teddy</name> 
    <color>brown</color> 
    <breed>tabby</breed> 
  </cat> 
  <dog> 
    <name>jade</name> 
    <color>black</color> 
    <breed>lab cross</breed> 
  </dog> 
</animals> 
THE_XML; 
$xml_object = new XMLReader(); 
$xml_object->XML($xml); 
$dog_parent = false; 
while ($xml_object->read()) { 
    if ($xml_object->nodeType == XMLREADER::ELEMENT) { 
        if ($xml_object->name == "cat") { 
            $dog_parent = false; 
        } else if ($xml_object->name == "dog") { 
            $dog_parent = true; 
        } else
        if ($xml_object->name == "name" && $dog_parent) { 
            $xml_object->read(); 
            if ($xml_object->nodeType == XMLReader::TEXT) { 
                print $xml_object->value . "<br/>"; 
                $dog_parent = false; 
            } 
        } 
    } 
} 
?> 

此代码即使不包含命名空间元素或使用XPath,也较为复杂。

1.2.3 XMLReader的expand()函数

expand() 函数是XMLReader的一个有用函数,它会返回当前节点的一个DOMNode副本,这样就可以通过标签名搜索子树。示例代码如下:

$subtree = $xml_reader->expand(); 
$breeds = $subtree->getElementsByTagName('breed'); 

不过,建议只在子树本身不是很大的情况下使用。

1.3 XML总结

XML是一种非常有用的数据通信和存储工具,具有跨语言、平台独立的特性,适用于许多应用程序。XML文档的复杂度差异很大,从简单直接到具有复杂架构和多个命名空间。SimpleXML是处理大多数XML文档的最佳解决方案,但在适当的情况下,也可以使用DOM和XMLReader等替代方案。

2. JSON与PHP

2.1 JSON数据类型

JSON有七种数据类型:字符串、对象、数组、数字、true、false和null。以下是一些JSON示例:
- JSON对象 {"name":"Brian", "age":29}
- JSON数组 ["Brian", 29]
- 嵌套JSON对象

{    
    "dimensions": {
        "width":800, 
        "height":600
    },
    "format":"jpg",
    "alpha_channel": false,
    "filename":"clouds.jpg"
}
  • 嵌套JSON数组
[
    [128, 0, 128], 
    [128,0,128], 
    [255, 0, 255],
    [255, 0,255], 
    [255, 0, 255], 
    [128,0,128],
    [128, 0, 128], 
    [0, 0, 0], 
    [0,0,0]
]

2.2 PHP与JSON的转换

PHP有内置函数 json_encode json_decode 来进行JSON的编码和解码。以下是示例代码:

<?php 
// 省略PHP资源类型
$php_data_types = array(4.1, 3, NULL, true, false, "hello", new StdClass(), array()); 
$json = json_encode($php_data_types); 
$decoded = json_decode($json); 
?> 
<p>JSON Representation:<br/> 
<pre> 
<?php var_dump($json); ?> 
</pre> 
</p> 
<p>PHP Representation:<br/> 
<pre> 
<?php var_dump($decoded); ?> 
</pre> 
</p> 

运行此代码会输出JSON表示和PHP表示。

2.3 JSON编码注意事项

JSON会忽略单个书籍数组的数字键,但只要设置一个键为关联键,所有键(包括数字键)都会存储在JSON对象中。例如,修改以下代码:

$books = array(
    array("author" => "Lewis Carroll",
        "title" => "Alice's Adventures in Wonderland",
        "year" => 1865),
);

为:

$books = array(
    "sample_book" =>
    array("author" => "Lewis Carroll",
        "title" => "Alice's Adventures in Wonderland",
        "year" => 1865),
);

会在编码的JSON和解码的PHP表示中产生对象的对象。

3. Ajax技术

3.1 Ajax概述

Ajax允许在不进行全页面重新加载的情况下部分重新加载和操作渲染内容。Ajax调用通常是异步的后台调用,这样可以在不干扰主程序流程的情况下发送和检索数据。Ajax不是单一技术,而是由多个相互关联的工具组成,包括:
- 表示层 :HTML或XHTML、CSS和DOM
- 数据交换 :XML、JSON、HTML或纯文本
- 异步通信 :JavaScript XMLHttpRequest对象

3.2 Ajax的优缺点

3.2.1 优点
  • 提高用户体验,使网站更具响应性和吸引力。
  • 减少不必要的全页面重新加载,加快浏览速度。
3.2.2 缺点
  • 浏览器的后退按钮和书签无法跟踪Ajax状态。
  • 动态生成的内容难以被搜索引擎索引。
  • 需要为非JavaScript用户进行优雅降级,增加额外工作。
  • 存在屏幕阅读器的可访问性问题。

3.3 传统Web模型与Ajax Web模型

3.3.1 传统Web模型

在传统Web模型中,客户端浏览器向Web服务器发送HTTP请求并接收响应。每次浏览器想要更新显示或验证输入时,都需要向服务器发送完整请求,浏览器会等待服务器的反馈。

3.3.2 Ajax Web模型

在Ajax Web模型中,客户端和服务器之间有一个中间层——Ajax引擎。客户端将事件发送给Ajax引擎,Ajax引擎根据事件类型要么操作客户端的表示层,要么向服务器发送异步事件。服务器响应Ajax引擎,然后Ajax引擎更新客户端。这样可以在不进行全页面刷新的情况下进行通信,不会打断用户的思路。

3.4 异步与同步事件

3.4.1 同步事件

在同步模型中,需要等待一个事件的服务器响应后才能发送下一个请求,事件是顺序执行的,前一个事件会阻塞后续事件。

3.4.2 异步事件

异步事件中,请求不需要等待,它们可以并行执行。即使一个事件还在等待服务器响应,新的事件也可以立即开始HTTP请求,从而加快整体事件处理时间。

3.5 XMLHttpRequest对象

3.5.1 创建XMLHttpRequest对象

创建XMLHttpRequest对象的代码如下:

<script type="text/javascript"> 
    var xhr = new XMLHttpRequest(); 
</script> 
3.5.2 设置请求参数

使用 open() 函数设置请求参数,示例代码如下:

<script type="text/javascript"> 
    var xhr = new XMLHttpRequest(); 
    xhr.open("GET", "animals.xml"); 
</script> 

open() 函数的参数包括请求方法、URL、是否异步等。

3.5.3 设置请求头

默认情况下,请求发送的头信息是 "application/xml;charset=_charset" ,可以使用 setRequestHeader() 函数覆盖这些值。

3.5.4 定义回调函数

在发送请求之前,需要定义回调函数,检查 readyState 为4表示请求完成。示例代码如下:

xhr.onreadystatechange=function(){ 
    if (xhr.readyState == 4){ // ready state 4 is completion 
        if (xhr.status==200){ 
            alert("success"); 
        } 
        else{ 
            alert("error"); 
        } 
    } 
} 
3.5.5 发送请求

最后,使用 send() 函数发送请求:

xhr.send("our content"); 

完整的基本XMLHttpRequest示例代码如下:

<script type="text/javascript"> 
    var xhr = new XMLHttpRequest(); 
    xhr.open("GET", "animals.xml"); 
    xhr.onreadystatechange=function(){ 
        if (xhr.readyState == 4){ // ready state 4 is completion 
            if (xhr.status==200){ 
                alert("success"); 
            } 
            else{ 
                alert("error"); 
            } 
        } 
    } 
    xhr.send("our content"); 
</script> 

3.6 总结

通过本文,我们了解了XML、JSON和Ajax的相关知识。XML适用于数据的通信和存储,JSON是一种轻量级的数据交换格式,而Ajax则可以在不刷新整个页面的情况下实现异步数据交互,提高用户体验。在实际开发中,应根据具体需求选择合适的技术。

以下是一个简单的mermaid流程图,展示Ajax请求的基本流程:

graph LR
    A[创建XMLHttpRequest对象] --> B[设置请求参数]
    B --> C[设置请求头]
    C --> D[定义回调函数]
    D --> E[发送请求]
    E --> F{请求完成?}
    F -- 是 --> G{请求成功?}
    G -- 是 --> H[处理成功响应]
    G -- 否 --> I[处理错误响应]
    F -- 否 --> E
技术 优点 缺点 适用场景
XML 跨语言、平台独立,适用于结构化数据 解析和处理相对复杂 数据通信和存储,特别是需要严格结构的场景
JSON 轻量级、易于解析和生成 缺乏严格的结构定义 数据交换,特别是在前后端交互中
Ajax 无需全页面刷新,提高用户体验 存在兼容性和可访问性问题 需要异步数据交互的Web应用

4. 实际应用示例

4.1 构建表格绘图网格示例

为了更好地理解如何综合运用JSON和Ajax,我们将构建一个基于表格的绘图网格示例。在这个示例中,我们可以修改、编辑、保存和加载绘图网格的数据。

4.1.1 功能概述

我们将使用jQuery来改变表格单元格的背景颜色,并通过Ajax请求与PHP服务器进行交互,将绘图数据保存到文件中,以及在重新访问页面时加载数据。

4.1.2 具体实现步骤
  1. HTML结构 :创建一个包含表格的HTML页面,用于显示绘图网格。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>绘图网格</title>
    <style>
        table {
            border-collapse: collapse;
        }
        td {
            width: 20px;
            height: 20px;
            border: 1px solid black;
        }
    </style>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
    <table id="grid"></table>
    <button id="save">保存</button>
    <button id="load">加载</button>
    <script>
        // 生成表格
        const rows = 10;
        const cols = 10;
        for (let i = 0; i < rows; i++) {
            const row = $('<tr></tr>');
            for (let j = 0; j < cols; j++) {
                const cell = $('<td></td>');
                row.append(cell);
            }
            $('#grid').append(row);
        }

        // 点击单元格改变背景颜色
        $('#grid td').click(function() {
            $(this).css('background-color', 'red');
        });

        // 保存数据
        $('#save').click(function() {
            const data = [];
            $('#grid tr').each(function() {
                const rowData = [];
                $(this).find('td').each(function() {
                    rowData.push($(this).css('background-color'));
                });
                data.push(rowData);
            });
            const jsonData = JSON.stringify(data);
            $.ajax({
                url: 'save.php',
                method: 'POST',
                data: { data: jsonData },
                success: function(response) {
                    alert('保存成功');
                },
                error: function() {
                    alert('保存失败');
                }
            });
        });

        // 加载数据
        $('#load').click(function() {
            $.ajax({
                url: 'load.php',
                method: 'GET',
                success: function(response) {
                    const data = JSON.parse(response);
                    $('#grid tr').each(function(index) {
                        $(this).find('td').each(function(subIndex) {
                            $(this).css('background-color', data[index][subIndex]);
                        });
                    });
                    alert('加载成功');
                },
                error: function() {
                    alert('加载失败');
                }
            });
        });
    </script>
</body>
</html>
  1. PHP保存脚本(save.php) :接收JSON数据并将其保存到文件中。
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $data = $_POST['data'];
    file_put_contents('data.json', $data);
    echo 'success';
}
?>
  1. PHP加载脚本(load.php) :从文件中读取JSON数据并返回给客户端。
<?php
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
    $data = file_get_contents('data.json');
    echo $data;
}
?>

4.2 示例总结

通过这个示例,我们展示了如何使用JSON来表示绘图网格的数据,并通过Ajax请求与服务器进行数据的保存和加载。jQuery简化了DOM操作,使得改变单元格背景颜色变得容易。PHP作为服务器端脚本,负责处理数据的存储和读取。

5. 技术对比与选择建议

5.1 XML、JSON和Ajax的对比

技术 数据格式特点 解析难度 数据传输效率 适用场景
XML 具有严格的标签结构,支持命名空间和DTD,适合表示复杂的层次结构数据 解析相对复杂,需要特定的解析器 数据量较大,传输效率相对较低 数据通信和存储,特别是需要严格结构和验证的场景,如企业级应用中的数据交换
JSON 轻量级,采用键值对和数组的形式,易于阅读和编写 解析简单,大多数编程语言都有内置的解析函数 数据量较小,传输效率高 数据交换,特别是在前后端交互中,如Web应用的API数据传输
Ajax 不是数据格式,而是一种异步通信技术,可使用XML、JSON等作为数据载体 主要涉及JavaScript的异步编程,有一定的学习曲线 无需全页面刷新,提高用户体验,传输效率取决于数据格式 需要异步数据交互的Web应用,如实时更新、表单验证等

5.2 选择建议

  • 数据存储和通信 :如果需要严格的结构和验证,XML是一个不错的选择;如果追求轻量级和高效的数据交换,JSON更合适。
  • Web应用开发 :对于简单的前后端数据交互,JSON和Ajax结合使用可以快速实现功能;对于复杂的企业级应用,可能需要考虑XML的严格结构和验证机制。
  • 用户体验 :如果需要在不刷新整个页面的情况下更新部分内容,提高用户体验,Ajax是必不可少的技术。

6. 总结与展望

6.1 总结

本文详细介绍了XML、JSON和Ajax的相关知识,包括它们的特点、使用方法和适用场景。XML是一种传统的数据通信和存储工具,具有严格的结构;JSON是一种轻量级的数据交换格式,易于解析和生成;Ajax则是一种异步通信技术,可以在不刷新整个页面的情况下实现数据交互,提高用户体验。

6.2 展望

随着Web技术的不断发展,JSON和Ajax在现代Web应用中的应用越来越广泛。未来,我们可以期待这些技术在性能、安全性和兼容性方面的进一步提升。同时,随着物联网和大数据的发展,数据的交换和处理需求将不断增加,XML、JSON和Ajax等技术将继续发挥重要作用。

以下是一个mermaid流程图,展示数据保存和加载的流程:

graph LR
    A[用户操作] --> B{保存或加载?}
    B -- 保存 --> C[收集表格数据]
    C --> D[将数据转换为JSON]
    D --> E[发送Ajax POST请求到save.php]
    E --> F{保存成功?}
    F -- 是 --> G[提示保存成功]
    F -- 否 --> H[提示保存失败]
    B -- 加载 --> I[发送Ajax GET请求到load.php]
    I --> J{加载成功?}
    J -- 是 --> K[将JSON数据转换为表格数据]
    K --> L[更新表格显示]
    L --> M[提示加载成功]
    J -- 否 --> N[提示加载失败]

在实际开发中,我们应根据具体需求灵活选择和运用这些技术,以实现高效、稳定和用户体验良好的Web应用。

内容概要:本文围绕六自由度机械臂的人工神经网络(ANN)设计展开,重点研究了正向逆向运动学求解、正向动力学控制以及基于拉格朗日-欧拉法推导逆向动力学方程,并通过Matlab代码实现相关算法。文章结合理论推导仿真实践,利用人工神经网络对复杂的非线性关系进行建模逼近,提升机械臂运动控制的精度效率。同时涵盖了路径规划中的RRT算法B样条优化方法,形成从运动学到动力学再到轨迹优化的完整技术链条。; 适合人群:具备一定机器人学、自动控制理论基础,熟悉Matlab编程,从事智能控制、机器人控制、运动学六自由度机械臂ANN人工神经网络设计:正向逆向运动学求解、正向动力学控制、拉格朗日-欧拉法推导逆向动力学方程(Matlab代码实现)建模等相关方向的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握机械臂正/逆运动学的数学建模ANN求解方法;②理解拉格朗日-欧拉法在动力学建模中的应用;③实现基于神经网络的动力学补偿高精度轨迹跟踪控制;④结合RRTB样条完成平滑路径规划优化。; 阅读建议:建议读者结合Matlab代码动手实践,先从运动学建模入手,逐步深入动力学分析神经网络训练,注重理论推导仿真实验的结合,以充分理解机械臂控制系统的设计流程优化策略。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值