XML文件开发中几乎天天用,但很少去了解它的各种定义与原理,一篇博客虽然不能做到完全通透,但至少要让自己遇到bug不再慌乱。
XML指可扩展语言,全称eXtensible MarkupLanguage,其宗旨是为了描述数据,而不是像HTML那样显示数据。目前遵循的是W3C组织于2000年发布的XML1.0规范。使用场景主要为描述数据和充当配置文件。
- 基本语法
文档声明:告知解析器这是一个XML文件,必须出现在文档第一行。最简单也是最常见的即:
<?xml version="1.0" encoding="UTF-8"?>
其实不用encoding也可以,但为了编码统一,此处使用UTF-8
- 元素(标签)
- XML语法严格,不能够省略结束标签
- XML中只能有一个根标签
- XML中不会忽略主体内容出现的空格与换行
- 元素(标签)的名称可以包含字母、数字、减号、下划线和英文句点,但必须遵守下面的一些规范:
严格区分大小写/只能以字母或者下划线开头/名称字符之间不能有空格/名称字符之间不能使用冒号
- 元素的属性
一定要以单引号或者双引号引起来/元素中的属性不允许重复
- 注释
<! >
但不允许出现在声明之前
- CDATA
character data
<![CDATA[内容]]>
其中的内容都会被处理为字符串
- 特殊字符的替代字符
& &
< <
> >
" "
' &apos
==============================>
- 约束
一个XML文件中的约束,主要是元素的定义,分为两种DTD(以.dtd结尾的文件,必须以UTF-8保存)和Schema(以.xsd结尾的文件)
- DTD
如果.dtd文件在XML外部(必须以UTF-8保存),如何导入呢?如果在本地,那么:
<!DOCTYPE 根元素 SYSTEM "dtd文件的路径">
如果该文件在网络上,那么:
<!DOCTYPE 根元素 PUBLIC "dtd名称" "DTD文档的URL链接地址">
也可以写在内部,对编码没有要求,此处仅了解。
来个简单的实例:
book.dtd
<!ELEMENT 书架 (书+)> <!ELEMENT 书 (书名,作者,售价)> <!ELEMENT 书名 (#PCDATA)> <!ELEMENT 作者 (#PCDATA)> <!ELEMENT 售价 (#PCDATA)> <!ATTLIST 书 ISBN ID #REQUIRED COMMENT CDATA #IMPLIED 出版社 CDATA "指令汇公司" > <!ENTITY copyright "指令汇公司">
book.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE 书架 SYSTEM "book.dtd"> <书架> <书 ISBN="QWDERF01" 出版社="指令汇公司" COMMENT="a+"> <书名>三体</书名> <作者>韩寒</作者> <售价>13</售价> </书> </书架>
当然,这里面有很多细节,但因此处最终目的只是了解xml解析的用法,所以略过,如果要了解,可以查看官方文档。
==============================>
- Schema约束
.xsd自身就是一个xml文件,根节点为<Schema/>,通常需要把这个文件中声明的元素绑定到一个URI地址上,告诉编辑器,这个xml文档中编写的元素被谁约束,来自哪里。DTD并不能很细致地约束xml,于是出现了Schema,后者大有取代之势。
注意:名称空间的名字语法容易让人混淆,尽管以 http:// 开始,那个 URL 并不指向一个包含模式定义的文件。事实上,这个 URL根本没有指向任何文件,只是一个分配的名字。
声明方式有两种,默认
xmlns="http://www.w3.org/2001/XMLSchema"
显示:xmlns:别名
xmlns:tns="http://www.example.org/books"
给出一份简易schema:books.xsd
<?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/books" xmlns:tns="http://www.example.org/books" elementFormDefault="qualified"> <element name="bookstore"></element> </schema>
这样的文档我们如何在xml文件中引用呢?
首先是显示使用根元素,通过targetNamespace指向这个文档的命名空间,而后固定格式实例化,最后以xsi:localtion标记"名称1 位置1 名称2 位置2 ..."
<?xml version="1.0" encoding="UTF-8"?> <bookstore xmlns="http://www.example.org/books" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/books books.xsd"></bookstore>
xsi是默认值,如果还有自定义值,那么自定义空间所定义的标签,使用时需<别名:标签名/>法使用,举个例子:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:p="http://www.springframework.org/schema/p" xmlns="http://www.springframework.org/schema/beans" xmlns:c="http://www.springframework.org/schema/c" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:cache="http://www.springframework.org/schema/cache" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd" default-lazy-init="true"> <description>Spring公共配置</description> <!-- 该 BeanPostProcessor 将自动对标注 @Autowired 的 Bean 进行注入 --> <context:annotation-config /> <!-- 使用annotation 自动注册bean, 并保证@Required、@Autowired的属性被注入 --> <context:component-scan base-package="com.changjiang.test.jdbcTemplate" />
这里context即为自定义的名称,所以使用标签是用到了<context:annotation-config/>。
本篇就介绍到这里,实际上,这只是为xml解析和平时开发读懂xml文档所做的准备,了解即可。