【PHP】操作JSON、XML数据

一、数据介绍

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');

每篇一言:理性的人追求的并非快乐,而只是避免痛苦。

  • 28
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cityミ slaves

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值