XML详解
0X00-引言
(1).png)
XML学习笔记,配套视频
0X01-XML概述
01-引入
01-XML是什么样的
<cs>
<app>
<id>1</id>
<name>baidu translate</name>
<virsion>3.0</virsion>
</app>
<app>
<id>2</id>
<name>你好</name>
<version>2.1</version>
</app>
<app>
<id>3</id>
<name>我很好</name>
<version>3.3</version>
</app>
</cs>
02-XML数据格式主要用途有哪些?
-
XML数据格式的主要作用是数据传输
-
程序之间的数据传输通讯,数据的载体,各编程语言都可以识别
-
配置文件 config.xml,xml文件在各个语言中具有通用性,可以做配置文件
-
存储数据,可以当做小型数据库,直接以文件的形式存储数据
-
规范数据格式,使数据具有结构性
02-什么是XML
- XML指的是,可扩展标记性语言
- XML被发明的目的是传输数据和存储数据,而不是展示数据(HTML)
- XML的标签要具有含义
- XML是W3C推举的数据传输格式
03-XML与HTML有什么不一样
- HTML标签不能自定义,XML标签只能自定义
- HTML语法要求不严格,XML语法要求极其严格,必须成对存在
- XML用来传输和存储数据,HTML用来展示数据
0X02-XML的基本语法
01-语法规则
- XML必须要有根节点,根节点就是其他所有节点的父级节点
- XML头部声明,可有可无,最好写上
- 所有XML元素都必须是成对标签
- 标签名区分大小写
- 标签不能交叉

- 注释符:
<!-- -->

- 特殊字符需要实体转义
| 转义符 | 转义内容 | 说明 |
|---|---|---|
& 或 & |
& | 和 |
< 或 < |
< | 小于号 |
> 或 > |
< | 小于号 |
" |
" | 双引号 |
|
空格 | |
© |
© | 版权符 |
® |
® | 注册符 |
02-元素属性
-
属性规则:一个标签可以有多个属性,属性的值必须使用引号括起来
-
属性就是表示标签自身的一些额外的信息
-
XML中属性就是鸡肋,因为标签可以自定义
-
解析XML数据时,属性会带来额外的解析代码(多了一步,比较麻烦)
-
写法
<name age="38">太白</name>和HTML一样
03-CDATA区域
CDATA区域不解析
注意:特殊字符较少时,使用实体替换,较多时使用CDATA,注意大写

04-XML文档类型声明(DTD)
XML文档类型声明(俗称DTD)是一种精确描述XML语言的方式。DTD根据适当XML语言的语法规则检查XML文档结构的词汇和有效性。
可以在文档中指定XML DTD,也可以将其保存在单独的文档中,然后单独添加。
01-用法
<!DOCTYPE element DTD identifier
[
declaration1
declaration2
........
]>
DTD开始于<!DOCTYPE分隔符,解析器判断为XML文档,从根元素解析文档。方括号[]包含一个为Internal Subset的实体声明的可选列表。
02-内部DTD
内部DTD指的是直接在XML文件中声明元素
XML头部声明中的属性standalone="yes"
语法
<!DOCTYPE root-element [element-declarations]>
直接例子分析
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE address [
<!ELEMENT address (name,company,phone)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT company (#PCDATA)>
<!ELEMENT phone (#PCDATA)>
]>
<address>
<name>Tanmay Patil</name>
<company>TutorialsPoint</company>
<phone>(011) 123-4567</phone>
</address>
头部声明
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
DTD文档类型声明,以<!DOCTYPE开始,解析器认为与XML文档相关。
<!DOCTYPE address [
在DTD的正文中可以声明元素,属性,实体和符号
<!ELEMENT address (name,company,phone)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT company (#PCDATA)>
<!ELEMENT phone (#PCDATA)>
<!ELEMENT address (name,company,phone)>中address为根节点,圆括号内的内容为子节点。
<!ELEMENT name (#PCDATA)><!ELEMENT name(#PCDATA)>将元素名称定义为“#PCDATA”类型。这里#PCDATA表示可分析的文本数据。
规则:
DTD声明必须放在文档的开头XML头部声明之后,且XML头部声明中standalone="yes"
DTD声明要符合DTD语法
在文档中使用DTD定义的根元素时,其根元素的子节点必须要在DTD声明中定义。
03-外部DTD
外部DTD元素在XML文件之外被声明。可以通过指定可能是合法的.dtd文件或有效URL 的系统属性来访问它们。要将其称为外部DTD,XML声明中的独立属性必须设置为no。这意味着声明包括来自外部来源的信息。
XML文档的头部声明设置为
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
外部DTD的语法为
<!DOCTYPE root-element SYSTEM "file-name">
其中file-name是.dtd扩展名的文件
实例:
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<!DOCTYPE address SYSTEM "address.dtd">
<address>
<name>Tanmay Patil</name>
<company>TutorialsPoint</company>
<phone>(011) 123-4567</phone>
</address>
第一行为XML头部声明,注意standalone="no"与内部DTD声明不同
第二行SYSTEM为系统标识符,指向外部文件的位置
01-系统标识符
语法
引用外部文件
<!DOCTYPE name SYSTEM "address.dtd" [...]>
它包含关键字SYSTEM和指向文档位置的URI
02-公共标识符
公共标识符提供了一种定位DTD资源的机制
<!DOCTYPE name PUBLIC "-//Beginning XML//DTD Address Example//EN">
它以关键字PUBLIC开始,后跟一个专门的标识符。公共标识符用于标识目录中的条目。公共标识符可以遵循任何格式,但是常用的格式称为正式公共标识符或FPI。
04-声明实体格式
在DTD中进行实体声明时,将使用ENTITY关键字来声明。实体是用于定义引用普通文本或特殊字符的快捷方式的变量。实体可在内部或外部进行声明。
内部声明实体格式:
<!ENTITY 实体名称 "实体的值">
引用外部实体格式:
<!ENTITY 实体名称 SYSTEM "URI">
0X03-使用PHP解析XML
XML是一种数据传输格式,当PHP接收到的数据就是一段XML的时候,怎么用PHP出来XML数据呢?
在PHP5版本以后,其提供了一个非常强大的类库,SimpleXML类库,专门用于实现对XML文档的解析操作。
01-XML解析原理
PHP解析XML共分为3步:
- 读取XML文档到内存
- 形成DOM树
- 由DOM树生成对象并返回
02-SimpleXML类库
xml:

simplexml解析:

分析解析后的数据:
object(SimpleXMLElement)#1 (1) { ["man"]=> array(2) { [0]=> object(SimpleXMLElement)#2 (2) { ["name"]=> string(6) "尽兴" ["age"]=> string(2) "36" } [1]=> object(SimpleXMLElement)#3 (2) { ["name"]=> string(6) "太白" ["age"]=> string(2) "55" } } }

simplexml.php:从xml中提取“尽兴”,simplexml解析生成数组,尽兴的数组下标为0

03-遍历XML数据
遍历标签name的内容
foreach循环:
echo $x->man[0]->name;foreach($x->man as $v){ echo $v->name;}
for循环:
$c = count($x->man);for ($i=0;$i<$c;$i++){ echo $x->man[$i]->name;}


04-添加节点
运用PHP里面的方法添加节点
<?php//simple_load_file解析XML文档,返回PHP对象$x = simplexml_load_file('test.xml');//对象中的addChild创建节点并给创建后的节点添加内容$man = $x -> addChild('man');$man->addChild('name','玉帝');$man->addChild('age','999');var_dump($x);//将添加后的对象重新解析成XML文档,写入文件$x->asXML('test.xml');

添加成功


浙公网安备 33010602011771号