简介
关于
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属性定义版本,encoding声明编码格式
- 必须包含一个根标签,标签名自定义
- XML标签大小写敏感
- 所有XML标签都必须闭合,自闭合标签禁止省略/
- XML的属性值须加引号,即便属性值是数值,单双引号均可用
- XML标签禁止交叉嵌套
- XML中多个连续空格也会被保留,HTML中会被合并
- XML 以 LF 存储换行
空标签
xml允许空标签,即标签中无内容
转义字符
以下字符在XML中被预定义,使用时需要转义
字符 | 转义 | 字符 | 转义 |
---|---|---|---|
< | < | ' | ' |
> | > | " | " |
& | & |
CDATA字符数据
CDATA(character data)指不被xml解析器解析的文本数据,当文档中出现需要大量转义的字符时,可以直接使用CDATA进行引用,这样,这些字符将不会被xml解析器解析,
CDATA 部分由<![CDATA[开始,]]>结束
命名空间
由于xml中标签是自定义的,多个xml文档同时使用可能出现标签名相同导致命名冲突的情况,此时需要使用命名空间来解决标签名冲突问题
添加前缀
在标签名前添加前缀,来定义不同的标签,从而对不同文档的同名标签加以区分
添加XML Namespace(xmlns)属性
可以在父标签中添加命名空间属性,以此定义一个命名空间,之后带有相同前缀的子标签都将同属于该命名空间
xmlns:命名前缀=”namespaceURI”
使用默认的命名空间
当父元素定义默认的命名空间时,我们可以省略子元素中的前缀
xmlns=”namespaceURI”
DTD验证
DTD(Document Type Definition):文档类型定义,是一套为了进行程序间的数据交换而建立的关于标记符的语法规则
xml的标签是可以自由定义的,每个人写的xml将完全不同。但在一个团队内部,我们往往希望拥有一个统一的文件格式来进行数据交换。此时,我们可以使用DTD来对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?)> 子元素出现零次或一次
声明实体
<!ENTITY 实体引用名称 “实体实际代表含义”> 定义一个实体
引用实体需要添加&和;
属性声明
限制标签可添加的属性以及属性值,语法格式为:
<!ATTLIST 标签名 属性名 属性类型 属性值>
属性类型 | 说明 | 属性类型 | 说明 |
---|---|---|---|
CDATA | 字符 | NMTOKEN | 该值是有效的XML名称 |
(v1|v2|..) | 值只能为指定内容(枚举) | NMTOKENS | 该值是有效XML名称的列表 |
ID | 值为唯一ID | ENTITY | 值是一个实体 |
IDREF | 值是另一个元素的id | ENTITIES | 值是实体列表 |
IDREFS | 该值是其他ID的列表 | xml: | 该值是预定义的xml值 |
属性值 | 说明 | 属性值 | 说明 |
---|---|---|---|
字符串 | 属性默认值 | #REQUIRED | 属性是必需的 |
#IMPLIED | 属性是可选的 | #FIXED 值 | 属性值是固定的 |
DTD文件引入
内部DTD
如果DTD被包含在xml文件中,需要被包装于DOCTYPE声明中
<!DOCTYPE 根标签 [标签声明内容]>
外部私有DTD
可以将DTD声明为一个外部文件,然后引用到xml文档中
<!DOCTYPE 根标签 SYSTEM “DTD的URL”>
外部公用DTD
也可以使用一些标准化组织或权威机构提供的DTD
<!DOCTYPE 根标签 PUBLIC “DTD公共名称” “DTD的URL”>
DTD公共名称格式为:“是(否)ISO注册//注册组织//DTD所描述的文件的信息//语言”
- 是否由国际标准化组织(ISO)注册,+表示是,-表示不是
- 注册组织或个人
- 该DTD所验证文件的描述性信息,经常还会添加版本号
- 语言标识,如:ZH为中文,EN为英文lt;!DOCTYPE web PUBLIC "-//shiwivi//blog config//CN" "http://www.shiwivi.com/blog/check.dtd">