文章目录
- 0x00 前言
- 0x01 XML简介
- 1 设计XML格式语言原因
- 2 什么是XML
- 3 XML与HTML区别
- 0x02 XML基本语法
- 1 语法规则
- 2 CDATA 忽略解析
- 0x03 使用PHP解析XML文档
- 1 解析实现
- 2 解析原理
- 3 遍历及增加节点
- 4 Xpath语言
- 1) 使用绝对路径查找
- 2) 使用相对路径查找
- 3) 使用*匹配所有
- 4) 条件查找
0x01 XML简介
1 设计XML格式语言原因
例如每个网站的天气预报的展现形式不一样,不过从气象局获取的数据都是一样的,但是每个网站的端页面有可能由php、Java、html5等语言编写,此时需要可以针对多个页面平台的可识别格式的天气预报信息,XML格式语言由此被发明出来。
一段标准的XML格式天气数据信息:
2 什么是XML
XML指可扩展标记语言(eXtensible Markup Language);
XML容易学习;
XML被发明的目的是传输和存储数据,而不是展示数据;
XML的标签必须自定义,但是在写标签名的时候一定要有含义(类似变量名定义);
XML是V3C推举的数据传输格式。
XML实例:
<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>HanMeiMei</to>
<from>LiWei</from>
<heading>Reminder</heading>
<body>You are mine and Only!</body>
</note>
3 XML与HTML区别
XML最主要的功能是数据传输、配置文件config.xml、储存数据当作小型数据库,HTML旨在显示数据;
HTML标签不能自定义,XML标签只能自定义;
HTML语法要求不严格;XML语法要求严格,必须是成对标签;
XML用来传输和存储数据,HTML用来展示数据。
0x02 XML基本语法
1 语法规则
1)必须有根节点
根节点就是其它所有节点的父节点:
<root>
<whatever>……</whatever>
<thanks>^</thanks>
</root>
2)XML头声明:不强制要求,可有可无,但是建议写
版本号,文件编码
<?xml version = "1.0" encoding="utf-8"?>
<root>
<whatever>……</whatever>
<thanks>^</thanks>
</root>
3)所有XML元素都必须是成对标签
<?xml version = "1.0" encoding="utf-8"?>
<root>
<whatever>……</whatever> 正确
<thanks>^</thanks> 正确
<a>ddd</b> 错误
</root>
4)标签名大小写敏感
<?xml version = "1.0" encoding="utf-8"?>
<root>
<whatever>……</whatever> 正确
<thanks>^</thanks> 正确
<a>ddd</A> 错误
</root>
5)标签不能交叉
<?xml version = "1.0" encoding="utf-8"?>
<root>
<whatever>……</whatever> 正确
<thanks>^</thanks> 正确
<a>ddd<b>hh</a></b> 错误
</root>
6)特殊字符使用实体转义
在 XML 中,一些字符拥有特殊的意义。若把字符 <
放在 XML文件中,则会生错误,这是因为解析器会把它当作新元素的开始。
下例是产生XML解析错误:<message>if salary < 1000 then</message>
为了避免这个错误可以用实体引用来代替<
字符:<message>if salary < 1000 then</message>
在 XML 中,有 5 个预定义的实体引用:
| < | 小于 |
| > | 大于 |
| & | 与 |
| ’ | 单引号 |
| " | 双引号 |
7)属性标签
一个标签可以有多个属性,属性的值必须使用双引号或单引号;
命名规则:数字字母下划线,数字不能开头;
属性时表示标签自身的一些额外信息;
<?xml version = "1.0" encoding="utf-8"?>
<root>
<man>
<name>王晴川</name>
<age>36</age>
</man>
<man>
<name age = "38">王晴川</name>
</man>
</root>
2 CDATA 忽略解析
在上一节中特殊字符使用实体转义方法对特殊字符进行转义,但是若包含特殊字符(<
、&
)较多时,可以使用CADTATA进行忽略解析。
语法:<![CDATA[……不需要解析的内容……]]>
CDATA 部分中的所有内容都会被解析器忽略,例如:
<?xml version = "1.0" encoding = "utf-8"?>
<root>
<man>
<name>数学题</name>
<![CDATA[2 < 4 5 < 6 3 < 6]]>
</man>
<man>
<name age = "28">李白</name>
</man>
</root>
0x03 使用PHP解析XML文档
1 解析实现
在PHP5版本以后,其提供了一个非常强大的类库,SimpleXML类库,专门用于实现XML文档解析操作。simplexml_load_file() 函数把 XML 文档载入对象中。
语法:simplexml_load_file(file,class,options,ns,is_prefix)
如果失败,则返回 false。
例:
现在有一个待解析的xml文件,命名为3.1.xml:
<?xml version = "1.0" encoding = "utf-8"?>
<root>
<man>
<name>金星</name>
<age>36</age>
</man>
<man>
<name>太白</name>
<age>46</age>
</man>
</root>
若要将3.1.xml中的第一个名字解析出来,php代码如下:
<?php
if (file_exists('3.1.xml'))
{
$x = simplexml_load_file('3.1.xml');
var_dump($x);
echo $x->man[0]->name;
}
else
{
exit('Error.');
}
?>
运行结果如下:
2 解析原理
解析XML共分为3步:
1.读取XML文档到内存;
2.形成DOM树;
3.由DOM树生成对象并返回。
3 遍历及增加节点
若要解析3.1.xml所有name,则使用遍历方法,php代码如下:
<?php
if (file_exists('3.1.xml'))
{
$x = simplexml_load_file('3.1.xml');
foreach($x->man as $v){
echo $v->name;
}
}
else
{
exit('Error.');
}
?>
若在3.1.xml需要增加新节点man,例如“玉帝”“999”,则在php代码如下:
<?php
$x = simplexml_load_file('3.1.xml');
//对象中的addChild方法创建节点
$man = $x->addChild('man');
//对象中的addChild方法创建节点并给创建后的节点添加内容
$man->addChild('name','玉帝');
$man->addChild('age', '999');
var_dump($x);
//将添加后的对象新解析成XML文档,写入文件
$x->asXML('3.1.xml');
?>
4 Xpath语言
Xpath是一门专门用来查找XML数据内容的语言,用来在XML文件中对文件或属性进行遍历。
1) 使用绝对路径查找
例:
xml为上节中的3.1.xml,使用绝对路径查找所有name节点,php代码为:
<?php
$x = simplexml_load_file('3.1.xml');
$d = $x->xpath('/root/man/name');
foreach($d ad $v){
echo $v;
}
?>
2) 使用相对路径查找
例:
xml为上节中的3.1.xml,使用相对路径查找所有name,php代码为:
<?php
$x = simplexml_load_file('3.1.xml');
$d = $x->xpath('//name');
foreach($d ad $v){
echo $v;
}
?>
3) 使用*匹配所有
例:
xml为上节中的3.1.xml,使用*匹配所有name节点,php代码为:
<?php
$x = simplexml_load_file('3.1.xml');
$d = $x->xpath('//man/*');
foreach($d ad $v){
echo $v;
}
?>
4) 条件查找
例:
xml为上节中的3.1.xml,条件查找age小于120的name,php代码为:
<?php
$x = simplexml_load_file('3.1.xml');
$d = $x->xpath('//man/[age<120]');
foreach($d ad $v){
echo $v->name;
}
?>
以上。
参考资料:
.https://www.runoob.com/xml/xml-tutorial.html