XML数据
XML:可扩展性标记语言
XML被发明的目的是,传输和存储数据,而不是展示数据
XML标签必须自定义,标签名要有含义,且标签有开有合(必须成对)
所有的XML必须有一个根节点,意思就是要有一个标签包含所有内容就像HTML的“html”标签,这个标签一般为“root”
主要用途:
- 程序之间数据传输通讯
- 充当配置文件,如多个语言开发项目的时候
- 存放数据,充当小型数据库
特点:
- 规范的数据格式
- 数据具有结构性
- 易读易处理
XML的编写格式
XML头声明,不强制声明
XML区分大小写
XML不能使用特殊字符,如大于小于等
如果要使用,必须用实体
< : <
$gt :>
& : &
&apos : ’
" : "
XML注释<!-- -->
如下格式
<?xml version='1.0' encoding='utf-8' ?>
<root>
<name>test</name>
<!-- 注释内容 -->
</root>
XML属性:描述其本身额外的信息
如<age name='tangxiaohan'></age>
属性规则:一个标签可有多个属性
属性必须使用引号
命名规则与变量名规则差不多
不过属性用到的地方不多
XML不将数据解析
在有些时候我们可能要使用很多的特殊字符,但是你又不想使用类似于<
的转义字符,这里我们就可以用“CDATA”数据区域
“CDATA”不会将区域内的内容解析
格式如下:<![CDATA[不解析的内容。。。]]>
<root>
<user>托尔斯泰</user>
<msg><![CDATA[托尔斯泰说如果1+1>2,那么2+2将>4]]></msg>
</root>
XML数据解析
解析XML文件
既然XML是一种数据传输格式,那我们PHP怎么解析这种数据?
在php5版本后,为我们提供了一个非常强大的类库,SilpmeXML
专门用于实现XML文档的解析操作
使用函数simplexml_load_file(path)
; 解析XML文件,返回php对象
//xml
<root>
<user>托尔斯泰</user>
<msg><![CDATA[12423]]></msg>
</root>
//php
$res = simplexml_load_file('./test.xml');
print_r($res);
但这里我的测试结果好像不能解析CDATA的数据,如果是以xml文件格式存储的数据
php添加xml数据到xml文件
使用addChild
方法,他有两个参数,第一个是添加的节点名,第二个可选添加的值
如:
$x = simplexml_load_file('test.xml')//要添加值到xml首先得解析xml文件
$man = $x->addChild('man');//添加一个man节点
$man->addChild('name','遇');
$man->addChild('age',20);//向man节点添加两个节点,这两个节点填充数据
$x->asXML('test.xml');//将添加的内容写入到xml文件
解析XML内容
要解析XML内容使用simplexml_load_string
这个函数会解析xml字符串而不是具体文件
如
$txt="<root>
<name>test</name>
<!-- 注释内容 -->
</root>"
//
$res=simplexml_load_string($txt,'SimpleXMLElement',LIBXML_NOCDATA);
Xpath规则
Xpath是专门用来查找XML数据内容的一种规则
用来在XML文档中对元素及属性进行遍历
xpath(path)
查找语法
- 绝对路径查找
如下XML数据
<root>
<man>
<name>唐僧</name>
<age>40</age>
</man>
<man>
<name>孙悟空</name>
<age>23</age>
</man>
<man>
<name>猪八戒</name>
<age>18</age>
</man>
<man>
<name>沙悟净</name>
<age>60</age>
</man>
</root>
通过绝对路径查找man
下所有的name
$xmlObj=simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA);
$res = $xmlObj->xpath('/root/man/name');
var_dump($res);
打印结果,返回数组类型
通过相对路径查找xml数据中所有的name
$xmlObj=simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA);
$res = $xmlObj->xpath('//name');
var_dump($res);
使用通配符*
查找man
下面所有的节点内容
$xmlObj=simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA);
$res = $xmlObj->xpath('//man/*');
var_dump($res);
foreach ($res as $key => $value) {
echo $value;
}
返回结果
条件查找
查找man
节点的子节点age=40的数据
$xmlObj=simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA);
$res = $xmlObj->xpath('//man[age=40]');
var_dump($res);
返回结果 返回数组类型,数组值为属性->值
其他查找
last()查找最后一个 返回值与条件查找的返回值一样
$xmlObj=simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA);
$res = $xmlObj->xpath('//man[last()]');
var_dump($res);
数字查找 返回值与条件查找的返回值一样
如查找第二个
$xmlObj=simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA);
$res = $xmlObj->xpath('//man[2]');
var_dump($res);
根据属性查找
查找man
中有msg属性的记录
$xmlObj=simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA);
$res = $xmlObj->xpath('//man[@msg]');
var_dump($res);
来源:CSDN
作者:Sunshine12.5
链接:https://blog.csdn.net/weixin_45143481/article/details/104186434