一、XML简介
1、历史起源
gml(1969)->sgml(1985)->html(1993)->xml(1998)
Genaral Markup language
gml :通用标记语言
IBM 1969 专家共同研究一个课题:一个程序如何运行在多个系统中(系统可移植性)
sgml :标准通用标记语言
IBM 1985 对基本的gml进行了升级
html :英国科学家博纳斯.李 由 sgml 中定义了20个html标签实现了世界上第一个网页
html :1993 W3C 进行推广和使用
xml :1998年
2、什么是xml
XML
全 称:Extensible Markup Language
中文名:可扩展标记语言
用于标记电子文件使其具有结构性的标记语言,可以用来标记数据,定义数据类型,允许用户对自己的标记语言进行定义的源语言。
面试题:什么是XML,XML主要用途是什么?
答:可扩展标记语言,XML用于传输数据与存储数据。
3、xml与html区别
1)html标签不能自定义,从标签上不能达到“见词知意”的目的
<table></table>
<表格></表格>
2)html将数据与格式绑定在一起
xml只负责数据的传输与存储,其标签没有任何意义
3)不同浏览器解html不同
html语法要求不严格
等等
html主要用于数据的显示,xml主要用于数据传输
4、xml应用场景
1)充当程序间交互的中间件(通讯标准)
快递100接口(Java) XML PHP
2)小型数据库
php+mysql 金山词霸
php+xml 金山词霸
5、xml传输原理
图片1
二、XML基本语法
1、快速入门
2、xml基本语法
l 文档声明
l 元素
l 元素属性
l 注释
l 特殊字符
l CDATA区段
l 处理指令
1)文档声明
需要先使用文档声明来声明XML文档
最简单的语法:
l <?xml version=“1.0” encoding=“utf-8”?>
l version 版本为1.0 (代表当前xml文档的版本)
l encoding 编码格式 (编码格式utf-8、big5、gb2312)
l standalone 是否独立(是否依靠dtd文件) 默认yes
作用:告诉浏览器在解释时所采用的版本与格式等信息
2)元素(标记、标签)
l 一个标签分为起始和结束标签(不能省略)
错误:<title>三国志
正确:<title>三国志</title>
<title />
l 一个标签中可以嵌套若干子标签,但所有标签必须合理的嵌套,不允许有交叉嵌套
错误:<title><price></title></price>
正确:<title><price></price></title>
l 一个XML文档必须有且仅有一个根标签,其他标签都是这个根标签的子标签
<html>
<head></head>
</html>
元素的命名规则
l 元素(标签)的名称可以包含字母、数字、减号、下划线和英文句点
正确的:<abc></abc>
错误的:<!@#></!@#>
l 严格区分大小写;
正确的:<abc></abc>
错误的:<abc></ABC>
l 只能以字母或下划线开头;
正确的:<abc123></abc123>
错误的:<123abc></123abc>
l 名称字符之间不能有空格或制表符;
正确的:<abc></abc>
错误的:<a b c></a b c>
l 名称字符之间不能使用冒号
正确的:<abc></abc>
错误的:<ab:c></ab:c>
3)元素属性
l 一个元素可以有多个属性
l 属性值一定要用引号(单引号或双引号)引起来
l 属性名称的命名规范与元素的命名规范相同
l 元素中的属性是不允许重复的
l 标签属性所代表的信息也可以被改成用子元素的形式来描述
4)注释
基本语法:
<!--注释内容-->
注:XML声明之前不能有注释,注释不能嵌套
5)特殊字符
可以使用以下字符代替xml文档中的特殊字符
图片2
6)CDATA区段(CDATA节)
CDATA:Character Data
作用:把标签当做普通文本内容
语法:<![CDATA[内容]]>
示例代码:
对于特殊字符与CDATA区段,比较?
共同点:都是用于对特殊字符的转化
不同点:特殊字符只能用于数据量较少的情况,比如小于号、大于号等情况
CDATA区段可以用于大批量数据的转化,如文章描述、文章内容等信息
三、PHP XML解析原理
1、为什么需要XML解析
图片3
2、如何进行XML解析(PHP)
PHP DOM模型进行XML解析(增加、修改、删除)
PHP SimpleXML(查询)
Json json_encode() json_decode()(推荐)
四、PHP DOM解析XML
1、PHP DOM模型
4)PHP解析XML四步走:
1、在内存中开辟存储空间——”面”
2、加载XML文件到内存,并形成DOM树结构
3、获取同级兄弟节点——“串”
4、获取指定的文本节点并读取其值——“点”
a)开辟内存空间,形成“面”
要用到的知识点:
DOMDocument
图片4
参数说明:
$version:xml版本号,采用1.0
$encoding:编码格式,utf-8
b)加载XML文件到内存,形成DOM树结构
要用到的知识点:
图片5
参数说明:
$filename:要载入xml文件的名称
c)找到同级兄弟节点,形成“串”
要用到的知识点
DOMNodeList
图片6
参数说明:
$length:获取到当前串的长度
item(索引,默认从0开始):获取指定节点
getElementsByTagName()
图片7
参数说明:
$name:要获取元素(标签、标记)的名称
d)获取同级兄弟节点并输出其值
要用到的知识点:
图片8
参数说明:
$index:通过索引获取指定元素
2、PHP DOM查询与遍历
3、PHP DOM增加操作
增加四步走:
1)开辟面空间
2)载入xml到内存,形成DOM树
3)创建节点并追加
4)保存内存数据到XML文件中
要用到的知识点:
图片9
参数说明:
$name :创建的节点名称
$value :可选参数,创建节点的值
图片10
参数说明:
$newnode :追加的新节点名称(要求类型为DOMElement或DOMNode)
图片11
参数说明:
$filename:要保存的xml文件名称
4、PHP DOM删除操作
删除操作五步走:
1)开辟内存空间,形成“面”
2)载入xml文件到内存
3)找到要删除的节点
4)找到其父节点并移除其指定的子节点
5)保存内存数据到xml文件中
要用到的知识点:
图片12
参数说明:
$oldnode:要移出的节点
5、PHP DOM更新操作
在PHP DOM更新操作分为两种:
1)值操作,只更新某个节点的值信息(通过nodeValue属性设置即可)
2)节点操作,需要特定的函数辅助完成(通过replaceChild方法设置即可)
值更新操作四步走:
1)开辟内存空间,形成“面”
2)载入xml文件到内存,形成dom树
3)找到要更新的节点,更新其值
4)保存内存数据到XML文件中
节点更新操作六步走:
1)开辟内存空间,形成“面”
2)载入xml文件到内存
3)创建新节点
4)找到旧节点
5)找到父节点,然后用新节点替换老节点
6)保存内存数据到XML文件中
要用到的知识点:
图片13
参数说明:
$newnode:创建的新节点
$oldnode:要更新的旧节点
6、属性操作
1)属性的添加与更新操作
要用到的知识点:
图片14
在属性的添加与更新操作用到的是同一个方法setAttribute,当当前元素无属性时,系统会自动添加属性,如果已存在,则更新其值
参数说明:
$name:属性名称
$value:属性的值
2)属性的判断与读取操作
bool DOMElement::hasAttribute ( string $name ) :判断当前元素是否具有某一属性
bool DOMNode:: hasAttributes ( void ) :判断当前元素是否具有属性
string DOMElement::getAttribute( string $name ) :获取元素的属性
参数说明:
$name :属性名称
3)移除属性
要用到的知识点:
bool DOMElement::removeAttribute ( string $name )
参数说明:
$name:要移出的属性名称
五、PHP SimpleXML实现对XML的增删改查
1、载入XML文件到内存,并形成SimpleXML对象
simpleXMLElement simplexml_load_file ( string $filename) :载入xml文件到内存并生成simpleXML对象
SimpleXMLElement::__construct ( string data)
示例代码:
2、输入指定文本节点的值
3、遍历输出所有数据
方法一:通过foreach直接遍历数组
方法二:
通过children()方法实现对xml数据的遍历输出
图片15
该方法可以直接获取到当前对象的子节点
4、输出属性
在simplexml对象中,对于属性的读取有些特殊,不能通过以上方法直接读取,必须借助外在方式:
通过数组方式直接读取:
通过attributes()方法获取到属性对象,并输入属性的值
图片16