简介
关于
XML 指可扩展标记语言(EXtensible Markup Language),其文件以.xml为后缀名,主要用于数据存储、数据传输、编写配置文件,语法格式与HTML相似,二者主要差异有:
- XML标签没有被预定义,需要自行定义标签;HTML虽然支持自定义标签,但主要使用预定义标签
- XML主要用于传输和存储数据,HTML主要用于显示数据
- XML语法要求比HTML严格
组成
xml文档基本由以下模块组成
- 标签(元素):文档主要部分,将被解析为XML DOM
- 标签属性:提供关于标签的信息
- 转义字符(实体):XML中预用字符的实体引用
- PCDATA(Parsed Character Data):需要由解析器解析的文本
- CDATA(Character Data):解析器不会解析的文本,内容将视为字符串
语法
xml标签定义规范
xml中的标签需要自定义,标签名需要遵循以下规范
- 可以包含字母、数字和其他符号,包括连字符(-)、下划线(_)和点号(.)
- 不能以数字或者标点符号开始
- 不能以xml、 XML、Xml开始
- 不能包含空格
- 尽量避免使用-和.字符,该类字符在某些XML解析器中中可能会被错误解析
- 避免使用:,该字符用于命名空间
xml基本语法格式
<?xml version="1.0" encoding="utf-8"?>
<web>
<author>SHIWIVI</author>
<license>CC BY-NC</license>
<heading><type>Document</type></heading>
<body>Meet you like the wind</body>
</web>
- 首行进行xml文档声明,version属性定义版本,encoding声明编码格式
- 必须包含一个根标签,标签名自定义
- XML标签大小写敏感
- 所有XML标签都必须闭合,自闭合标签禁止省略/
- XML的属性值须加引号,即便属性值是数值,单双引号均可用
- XML标签禁止交叉嵌套
- XML中多个连续空格也会被保留,HTML中会被合并
- XML 以 LF 存储换行
xml正确嵌套:
<a><b>content</b></a>
严禁交叉嵌套:
<a><b>content</a></b>
空标签
xml允许空标签,即标签中无内容
<element></element>
空标签可以使用自闭合,但禁止省略 /
<element />
转义字符
以下字符在XML中被预定义,使用时需要转义
| 字符 |
转义 |
字符 |
转义 |
| < |
< |
' |
' |
| > |
> |
" |
" |
| & |
& |
|
|
CDATA字符数据
CDATA(character data)指不被xml解析器解析的文本数据,当文档中出现需要大量转义的字符时,可以直接使用CDATA进行引用,这样,这些字符将不会被xml解析器解析,
CDATA 部分由<![CDATA[开始,]]>结束
<root>
<title>标题</title>
<![CDATA[
if(a<b&&b<c){
....
}
]]>
</root>
命名空间
由于xml中标签是自定义的,多个xml文档同时使用可能出现标签名相同导致命名冲突的情况,此时需要使用命名空间来解决标签名冲突问题
<person>
<name>周杰伦</name>
<song>米兰的小铁匠</song>
</person>
<person>
<name>东野圭吾</name>
<writing>解忧杂货店</writing>
</person>
添加前缀
在标签名前添加前缀,来定义不同的标签,从而对不同文档的同名标签加以区分
<j:person>
<j:name>周杰伦</j:name>
<j:song>米兰的小铁匠</j:song>
</j:person>
<h:person>
<h:name>东野圭吾</h:name>
<h:writing>解忧杂货店</h:writing>
</h:person>
添加XML Namespace(xmlns)属性
可以在父标签中添加命名空间属性,以此定义一个命名空间,之后带有相同前缀的子标签都将同属于该命名空间
xmlns:命名前缀=”namespaceURI”
<j:person xmlns:j="Jay Chou">
<j:name>周杰伦</j:name>
<j:song>米兰的小铁匠</j:song>
</j:person>
<h:person xmlns:h="Higashino Keigo">
<h:name>东野圭吾</h:name>
<h:writing>解忧杂货店</h:writing>
</h:person>
使用默认的命名空间
当父元素定义默认的命名空间时,我们可以省略子元素中的前缀
xmlns=”namespaceURI”
<person xmlns="Jay Chou">
<name>周杰伦</name>
<song>米兰的小铁匠</song>
</person>
<person xmlns="Higashino Keigo">
<name>东野圭吾</name>
<writing>解忧杂货店</writing>
</person>
URI指统一资源标识符(Uniform Resource Identifier),用于标识因特网资源,最常用的 URI 是用来标示因特网域名地址的统一资源定位器(URL),另一个不那么常用的 URI 是统一资源命名(URN),在使用命名空间时,很多xml文档会将名称写为一个链接形式,但该链接仅作为该命名空间的字符串名称,并不是要”链接”到某个地址,不会引入任何资源
DTD验证
DTD(Document Type Definition):文档类型定义,是一套为了进行程序间的数据交换而建立的关于标记符的语法规则
xml的标签是可以自由定义的,每个人写的xml将完全不同。但在一个团队内部,我们往往希望拥有一个统一的文件格式来进行数据交换。此时,我们可以使用DTD来对xml文件进行约束,使用一个标准的 DTD 来交换数据
使用IntelliJ IDEA写xml文件可以即时校验文档内容是否满足DTD验证
标签声明
限制标签内可以写入哪些内容
- <!ELEMENT 标签名 (child1,child2…)> 标签中可以包含的子标签
父标签中按顺序声明其中可以包含的子标签,子标签必须以相同的顺序出现在xml文档中,并且所有子标签也要声明其中可以写入的内容,子标签可以嵌套地拥有子标签
- <!ELEMENT 标签名 (child1,(child2|child3)…)> 标签中可以包含的子标签并可选
- <!ELEMENT 标签名 (#PCDATA)> 标签中仅包含需要解析的字符数据(可以为空)
- <!ELEMENT 标签名 EMPTY> 声明为空标签
- <!ELEMENT 标签名 ANY> 标签中可包含任何内容
- <!ELEMENT 标签名 (#PCDATA|child1|child2|…)*> 标签中可包含PCDATA数据,也可以包含指定子标签必须添加*号
限制子标签的数量
- <!ELEMENT 标签名 (child)> 子标签必须出现一次,且只能出现一次
- <!ELEMENT 标签名 (child+)> 子元素至少出现一次
- <!ELEMENT 标签名 (child*)> 子元素出现零次或多次
- <!ELEMENT 标签名 (child?)> 子元素出现零次或一次
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE web [
<!ELEMENT web (author,license,(body|content))>
<!ELEMENT author (#PCDATA)>
<!ELEMENT license (#PCDATA)>
<!ELEMENT heading (#PCDATA|type)*>
<!ELEMENT type (#PCDATA)>
<!ELEMENT body (#PCDATA)>
<!ELEMENT content (#PCDATA)>
]>
<web>
<author>SHIWIVI</author>
<license>lol</license>
<heading><type>Document</type></heading>
<body>Meet you like the wind</body>
</web>
1. !DOCTYPE web - 声明文档的根标签是web
2. !ELEMENT web - 声明web元素必须包含元素:author,license标签,body和content标签可二选一
3. !ELEMENT author - 声明author标签内容为 "#PCDATA"(其余语句同理)
4. !ELEMENT heading - 声明author标签内容为 "#PCDATA"或type标签,由于标签内容受限,需添加*号表示可出现零次或多次
声明实体
<!ENTITY 实体引用名称 “实体实际代表含义”> 定义一个实体
引用实体需要添加&和;
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE web [
<!ELEMENT web (author,license)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT license (#PCDATA)>
<!ENTITY sm "shiwivi.com">//实体声明
<!ENTITY license "License CC BY-NC 4.0">
]>
<web>
<author>&sm;</author>//将解析为<author>shiwivi.com</author>
<license>&license;</license>
</web>
属性声明
限制标签可添加的属性以及属性值,语法格式为:
<!ATTLIST 标签名 属性名 属性类型 属性值>
| 属性类型 |
说明 |
属性类型 |
说明 |
| CDATA |
字符 |
NMTOKEN |
该值是有效的XML名称 |
| (v1|v2|..) |
值只能为指定内容(枚举) |
NMTOKENS |
该值是有效XML名称的列表 |
| ID |
值为唯一ID |
ENTITY |
值是一个实体 |
| IDREF |
值是另一个元素的id |
ENTITIES |
值是实体列表 |
| IDREFS |
该值是其他ID的列表 |
xml: |
该值是预定义的xml值 |
| 属性值 |
说明 |
属性值 |
说明 |
| 字符串 |
属性默认值 |
#REQUIRED |
属性是必需的 |
| #IMPLIED |
属性是可选的 |
#FIXED 值 |
属性值是固定的 |
1. 限制为test标签添加的属性只能为code,如果开发者不指定属性值,则默认值为java
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE web [
<!ELEMENT web (test)>
<!ELEMENT test EMPTY>
<!ATTLIST test code "java">//属性声明
]>
<web>
<test code="javaScript"/>
</web>
2. 该标签必须添加code属性,并且不指定默认值
<!ATTLIST test code CDATA #REQUIRED>
3. 该标签不强制要求添加code属性,也不指定默认值
<!ATTLIST test code CDATA #IMPLIED>
4. 该标签强制拥有code属性并指定属性值为java,且不允许修改
<!ATTLIST test code CDATA #FIXED "java">
DTD文件引入
内部DTD
如果DTD被包含在xml文件中,需要被包装于DOCTYPE声明中
<!DOCTYPE 根标签 [标签声明内容]>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE web [
<!ELEMENT web (author,license)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT license (#PCDATA)>
]>
<web>
.....
</web>
外部私有DTD
可以将DTD声明为一个外部文件,然后引用到xml文档中
<!DOCTYPE 根标签 SYSTEM “DTD的URL”>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE web SYSTEM "./check.dtd">
<web>
....
</web>
<!--check.dtd文件-->
<!ELEMENT web (author,license)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT license (#PCDATA)>
外部公用DTD
也可以使用一些标准化组织或权威机构提供的DTD
<!DOCTYPE 根标签 PUBLIC “DTD公共名称” “DTD的URL”>
DTD公共名称格式为:“是(否)ISO注册//注册组织//DTD所描述的文件的信息//语言”