一、数据介绍
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。JSON 是基于ECMAScript的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据,并且简洁清晰,使其成为理想的数据交换语言。JSON具有键/值对的数据结构,类似于编程语言中的对象、映射或字典,其数组则类似于其他编程语言中的数组结构。由于JSON是纯文本格式,因此可以被任何编程语言读取和处理,而JSON解析器和库为多种编程语言提供了支持。
XML(可扩展标记语言,eXtensible Markup Language)是一种用于存储和传输数据的标准标记语言。它与HTML不同,主要用于表示数据的结构,不用于显示数据。XML的设计宗旨是传输数据,而不是显示数据。它的标签没有被预定义,需要用户自行定义,这使得XML具有很高的灵活性。XML能够以树形结构存储信息,包含一个根元素以及多个子元素和属性,这种结构有助于表达复杂的数据关系。同时,作为一种纯文本格式,XML文件默认使用UTF-8编码,适合在不同的平台和应用之间交换数据。
二、JSON数据操作
PHP使用方法,json_encode()将数据转换才字符串的形式;
使用方法,json_decode()将JSON的数据格式进行还原;
<?php
header("Content-type:text/html;charset=utf-8");
$users =array('张三','lisi','王五');
$js_users = json_encode($users);
echo $js_users;
$js_users_de = json_decode($js_users);
print_r($js_users_de);
$student01 = array('name'=> '张三', 'age'=> 30, 'addr'=> '北京', 'phone'=> '11111111111');
$student02 = array('name'=> '李四', 'age'=> 30, 'addr'=> '上海', 'phone'=> '22222222222');
$student03 = array('name'=> '王五', 'age'=> 25, 'addr'=> '南京', 'phone'=> '33333333333');
$student04 = array('name'=> '赵六', 'age'=> 30, 'addr'=> '西安', 'phone'=> '44444444444');
$source_class = array($student01,$student02,$student03,$student04);
$js_class = json_encode($source_class);
echo '<br>';
echo $js_class;
$de_js_class = json_decode($js_class);
echo '<br>';
echo '<br>';
print_r($de_js_class);
?>
三、XML数据操作
构造一个XML文件student.xml
<class id="cname">
<!-- 定义一个名为class的元素,其id属性值为"WNCDCO85" -->
<student sequence="1">
<!-- 定义一个名为student的元素,其sequence属性值为"1" -->
<id>011</id>
<!-- student元素的子元素id,内容为学生ID -->
<name>张三</name>
<!-- student元素的子元素name,内容为学生姓名 -->
<sex>男</sex>
<!-- student元素的子元素sex,内容为学生性别 -->
<age>22</age>
<!-- student元素的子元素age,内容为学生年龄 -->
<degree>本科</degree>
<!-- student元素的子元素degree,内容为学生学历 -->
<school>山鸡职业技术大学</school>
<!-- student元素的子元素school,内容为学生所在学校 -->
</student>
<student sequence="2">
<!-- 定义另一个名为student的元素,其sequence属性值为"2" -->
<id>021</id>
<!-- student元素的子元素id,内容为学生ID -->
<name>李四</name>
<!-- student元素的子元素name,内容为学生姓名 -->
<sex>男</sex>
<!-- student元素的子元素sex,内容为学生性别 -->
<age>29</age>
<!-- student元素的子元素age,内容为学生年龄 -->
<degree>本科</degree>
<!-- student元素的子元素degree,内容为学生学历 -->
<school>山鸡理工大学</school>
<!-- student元素的子元素school,内容为学生所在学校 -->
</student>
<student sequence="3">
<!-- 定义第三个名为student的元素,其sequence属性值为"3" -->
<id>031</id>
<!-- student元素的子元素id,内容为学生ID -->
<name>赵六</name>
<!-- student元素的子元素name,内容为学生姓名 -->
<sex>女</sex>
<!-- student元素的子元素sex,内容为学生性别 -->
<age>22</age>
<!-- student元素的子元素age,内容为学生年龄 -->
<degree>大专</degree>
<!-- student元素的子元素degree,内容为学生学历 -->
<school>山鸡职业学院</school>
<!-- student元素的子元素school,内容为学生所在学校 -->
</student>
</class>
使用php代码,读取上述XML文件节点内容
<?php
header("Content-type:text/html;charset=utf-8");
$doc = new DOMDocument(); //实例化一个DOM类
$doc ->preserveWhiteSpace = false; //删除无用的空格
$doc ->load('./student.xml'); //加载XML文件
$nodes = $doc->getElementsByTagName('id'); //根据标签获取节点
//遍历节点并输出其节点内容
foreach ($nodes as $node){
echo $node ->nodeValue . '<br>';
}
$nodes = $doc->getElementsByTagName("name");
foreach ($nodes as $node){
echo $node ->nodeValue . '<br>';
}
?>
使用php代码,读取上述XML文件节点属性
<?php
header("Content-type:text/html;charset=utf-8");
$doc = new DOMDocument(); //实例化一个DOM类
$doc ->preserveWhiteSpace = false; //删除无用的空格
$doc ->load('./student.xml'); //加载XML文件
$nodes = $doc->getElementsByTagName('student'); //根据标签获取节点
foreach ($nodes as $node){
echo $node->attributes->item(0)->nodeValue . '<br>';
}
?>
使用php代码,将上述XML转换为二维数组
<?php
header("Content-type:text/html;charset=utf-8");
$doc = new DOMDocument(); //实例化一个DOM类
$doc ->preserveWhiteSpace = false; //删除无用的空格
$doc ->load('./student.xml'); //加载XML文件
$nodes = $doc->getElementsByTagName('student'); //根据标签获取节点
$tags = array('id','name','sex','age','degree','school');
$students = array();
foreach ($nodes as $k =>$p){
print_r($k);
echo '<br>';
print_r($p);
echo '<br>';
foreach($tags as $tag){
$node = $p->getElementsByTagName($tag);
$students[$k][$tag] = $node->item(0)->nodeValue;
}
}
echo '<br>';
print_r($students)
?>
使用php代码,修改删除某个节点
<?php
// 创建一个新的DOMDocument对象
$doc = new DOMDocument();
// 不保留空白
$doc->preserveWhiteSpace = false;
// 设置格式化输出
$doc->formatOutput = true;
// 加载学生信息的XML文件
$doc->load("./student.xml");
// 获取所有名为"student"的节点
$nodes = $doc->getElementsByTagName("student");
// 修改第二个student节点的sequence属性值为5
$nodes->item(2)->attributes->item(0)->nodeValue = 5;
// 修改第二个student节点的name子节点的值为"李大言"
$nodes->item(2)->childNodes->item(1)->nodeValue = 'test';
// 删除一个节点:先找到父节点,再找到子节点,调用父节点的removeChild方法删除
// 获取第二个student节点作为父节点
$parent = $nodes->item(2);
// 获取要删除的子节点(这里是第五个子节点)
$child = $parent->childNodes->item(4);
// 从父节点中删除该子节点
$parent->removeChild($child);
// 直接找到要删除的节点自身,再向上一层找到父节点,再调用removeChild进行删除
// 获取要删除的degree节点
$child = $doc->getElementsByTagName('degree')->item(2);
// 获取该节点的父节点,并删除该节点
$child->parentNode->removeChild($child);
// 保存修改后的XML文件
$doc->save('./student.xml');
?>
四、使用Xpath操作XML数据
Xpath语法:
XPath表达式 | 描述 | 示例 |
---|---|---|
/ | 选择根元素 | /bookstore 选取根元素 <bookstore> |
// | 选择任何位置的元素 | //book 选取所有 <book> 元素,不论它们在文档中的位置 |
. | 选择当前节点 | . 选取当前节点 |
.. | 选择父节点 | .. 选取当前节点的父节点 |
@ | 选择属性 | @lang 选取名为 lang 的所有属性 |
nodename | 选取此节点的所有子节点 | title 选取所有 <title> 子节点 |
/nodename | 从根节点选取 | /bookstore 从根节点选取 <bookstore> 元素 |
//nodename | 选取文档中的任何 nodename 元素 | //book 选取文档中所有的 <book> 元素 |
nodename/ | 选取直接子节点 | bookstore/book 选取直接属于 <bookstore> 的 <book> 子节点 |
nodename// | 选取所有后代节点 | bookstore//book 选取所有属于 <bookstore> 后代的 <book> 节点 |
* | 匹配任何元素节点 | //* 选取文档中的所有元素 |
@* | 匹配任何属性节点 | //title/@* 选取所有 <title> 元素的全部属性 |
node() | 匹配任何类型的节点 | //node() 选取文档中的所有类型的节点 |
nodename[index] | 根据位置选取特定子节点 | /bookstore/book[1] 选取属于 <bookstore> 的第一个 <book> 子节点 |
nodename[last()] | 选取最后一个子节点 | /bookstore/book[last()] 选取属于 <bookstore> 的最后一个 <book> 子节点 |
nodename[position()<3] | 根据位置谓词选取前两个节点 | /bookstore/book[position()<3] 选取属于 <bookstore> 的前两个 <book> 子节点 |
nodename[@attribute] | 根据属性选取节点 | //book[@category] 选取拥有 category 属性的所有 <book> 节点 |
nodename[@attribute='value'] | 根据属性值选取节点 | //book[@category='cooking'] 选取 category 属性值为 cooking 的所有 <book> 节点 |
nodename[contains(@attribute,'value')] | 根据属性包含特定值选取节点 | //book[contains(@description,'Learning')] 选取 description 属性包含文本 Learning 的所有 <book> 节点 |
nodename[starts-with(@attribute,'value')] | 根据属性以特定值开始选取节点 | //book[starts-with(@title,'Harry')] 选取 title 属性以文本 Harry 开始的所有 <book> 节点 |
nodename[sum(expression)>value] | 根据求和表达式的结果大于某值选取节点 | //book[sum(price)>50] 选取所有 <book> 节点,其 price 元素的总和大于50 |
nodename[text()] | 根据文本内容选取节点 | //title[text()='Harry Potter'] 选取文本内容为 Harry Potter 的所有 <title> 节点 |
使用Xpath读取XML文件内容
<?php
// 创建一个新的DOMDocument对象
$doc = new DOMDocument();
// 设置不保留空白,使得XML文档更加紧凑
$doc->preserveWhiteSpace = false;
// 加载学生信息的XML文件
$doc->load("./student.xml");
// 创建一个新的DOMXPath对象,用于查询XML文档
$xpath = new DOMXPath($doc);
// 使用XPath表达式来查询特定节点
// 按照DOM路径,从class节点一直往下读取到name节点,且sequence属性为2的student节点
$exp = "/class/student[@sequence='2']/name";
// 执行XPath查询并获取结果
$nodes = $xpath->query($exp);
// 输出查询到的第一个节点的值,并换行
echo $nodes->item(0)->nodeValue . "<br/>";
// 使用XPath表达式读取到第三个学生的所有节点
$expr = "//student[@sequence='3']";
// 执行XPath查询并获取结果
$nodes = $xpath->query($expr);
// 遍历每个子节点,输出节点名称和值
foreach($nodes->item(0)->childNodes as $node){
echo $node->nodeName . ' => ' . $node->nodeValue . "<br/>";
}
?>
使用Xpath修改或删除XML节点
// 创建一个新的DOMDocument对象
$doc = new DOMDocument();
// 设置不保留空白,使得XML文档更加紧凑
$doc->preserveWhiteSpace = false;
// 格式化输出XML文档
$doc->formatOutput = true;
// 加载学生信息的XML文件
$doc->load("./student.xml");
// 创建一个新的DOMXPath对象,用于查询XML文档
$xpath = new DOMXPath($doc);
// 使用XPath表达式来查询特定节点
// 读取到第三个学生的所有节点,sequence属性为5的student节点
$exp = "//student[@sequence='5']";
// 执行XPath查询并获取结果
$nodes = $xpath->query($exp);
// 修改第三个学生的sequence属性值为6
$nodes->item(0)->attributes->item(0)->nodeValue = 6;
// 修改第三个学生的name节点的值为"杨大言"
$nodes->item(0)->childNodes->item(1)->nodeValue = '杨大言';
// 保存修改后的XML文件
$doc->save('./student.xml');
每篇一言:理性的人追求的并非快乐,而只是避免痛苦。