xml概述
什么是XML
XML :可扩展标记语言(EXtensible Markup Language)。
XML是一种标记语言,很类似 HTML,HTML文件也是XML文档,标签都是自定义的。
W3C在1988年2月发布1.0版本,2004年2月又发布1.1版本,单因为1.1版本不能向下兼容1.0版本,所以1.1没有人用。同时,在2004年2月W3C又发布了1.0版本的第三版。
XML与HTML的主要差异
xml标签都是自定义的,html标签是预定义。
xml的语法严格,html语法松散。
xml是存储数据的,html是展示数据。
xml的作用
存放数据
注意:创建 File,写 xxxxx.xml,一定要写.xml。
如在person.xml中添加如下内容:
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="p001">
<name>张三</name>
</person>
<person id="p002">
<name>李四</name>
</person>
</persons>
类似于java代码
class Person{
String id;
String name;
}
配置文件(框架常用)
比如:下面的是Spring框架的部分配置文件写法,使用的就是xml文件。
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean className="com.coydone.bean.User">
<property name="username" value="jack"></property>
</bean>
</beans>
xml的组成元素
文档声明
XML文档声明格式:
1、文档声明必须为结束;
2、文档声明必须从文档的0行0列位置开始;
3、文档声明只有2个属性:<?xml version="1.0" encoding="UTF-8"?>
-
version:指定XML文档版本。必须属性,因为我们不会选择1.1,只会选择1.0;
-
encoding:指定当前文档的编码。可选属性,默认值是utf-8;
元素
1、元素是XML文档中最重要的组成部分,
2、普通元素的结构开始标签、元素体、结束标签组成。例如:<hello>大家好</hello>
3、元素体:元素体可以是元素,也可以是文本.
4、空元素:空元素只有开始标签,而没有结束标签,但元素必须自己闭合,例如:<hello/>
5、元素命名:
-
区分大小写
-
不能使用空格,不能使用冒号:
-
不建议以XML、xml、Xml开头
6、格式化良好的XML文档,必须只有一个根元素。
属性
1、属性是元素的一部分,它必须出现在元素的开始标签中 2. 属性的定义格式:属性名=属性值,其中属性值必须使用单引或双引。
2、一个元素可以有0~N个属性,但一个元素中不能出现同名属性。
3、属性名不能使用空格、冒号等特殊字符,且必须以字母开头。
注释
XML的注释,使用<!--注释内容-->
。注释内容会被XML解析器忽略。
转义字符
因为很多符号已经被XML文档结构所使用,所以在元素体或属性值中想使用这些符号就必须使用转义字符,例如:``<、>、’、”、&`。
xml约束
在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束。常见的xml约束:DTD
、Schema
。
DTD约束
DTD(Document Type Definition),文档类型定义,用来约束XML文档。规定XML文档中元素的名称,子元素的名称及顺序,元素的属性等。
DTD重点要求
开发中,我们很少自己编写DTD约束文档,通常情况我们都是通过框架提供的DTD约束文档,编写对应的XML文档。常见框架使用DTD约束有:struts2、hibernate、mybatis 等。
规则文件说明(了解):
-
ELEMENT 表示节点
-
PCDATA 该内容模型说明元素中可以同时出现文本和元素.
-
CDATA 属性值是字符数据
-
REQUIRED 表示属性值是必需的
-
IMPLIED value 属性值是固定的
-
ATTLIST 在 DTD 中,属性通过 ATTLIST 声明来进行声明
如创建bean.dtd
文件
<?xml version="1.0" encoding="UTF-8"?>
<!--
模拟spring规范,如果开发人员需要在xml使用当前DTD约束,必须包括DOCTYPE。
格式如下:
<!DOCTYPE beans SYSTEM "bean.dtd">
-->
<!--
ELEMENT:节点
节点名称必须叫:beans
(bean*,import*) : beans 元素里面,可以写 bean import元素,别的都不能写
* : 可以写多个
PCDATA:表示property元素 里面可以写 文本 也可以写 元素
CDATA: 表示元素里面只能写文本
REQUIRED:表示这些只能写这些属性
ATTLIST:声明属性的作用
-->
<!ELEMENT beans (bean*,import*) >
<!ELEMENT bean (property*)>
<!ELEMENT property (#PCDATA)>
<!ELEMENT import (#PCDATA)>
<!ATTLIST bean id CDATA #REQUIRED
className CDATA #REQUIRED
>
<!ATTLIST property name CDATA #REQUIRED
value CDATA #REQUIRED
>
<!ATTLIST import resource CDATA #REQUIRED>
在bean.dtd
的同级目录下创建xxx.xml
,就可以通过dtd约束来写xml文件了。
<?xml version="1.0" encoding="UTF-8" ?>
<!--表示引入bean.dtd约束-->
<!DOCTYPE beans SYSTEM "bean.dtd">
<!--现在有约束了-->
<beans>
<bean id="b1" className="com.coydone.User">
<property name="p1" value="123"></property>
<property name="p1" value="123"></property>
<property name="p1" value="123">
<![CDATA[]]> (了解): 作用:把不合法的字符,转义成可用的字符。
<![CDATA[
public static void main(String args[]){
for(int i=0;i<5;i++){
}
for(int i=0;i<5;i++){
}
for(int i=0;i<5;i++){
}
for(int i=0;i<5;i++){
}
for(int i=0;i<5;i++){
}
}
]]>
</property>
</bean>
<bean id="b2" className="com.coydone.Customer">
<property name="p2" value="123"></property>
</bean>
<import resource="com.coydone.bean.Test01"></import>
</beans>
Schema约束
-
Schema是新的XML文档约束;
-
Schema要比DTD强大很多,是DTD 替代者;
-
Schema本身也是XML文档,但Schema文档的扩展名为xsd,而不是xml。
-
Schema 功能更强大,数据类型更完善
-
Schema 支持名称空间
Schema重点要求
与DTD一样,要求可以通过schema约束文档编写xml文档。常见框架使用schema的有:Spring, SpringMVC 等。
规则文件说明:
<beans xmlns="http://www.coydone.com/bean" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.coydone.com/bean bean- schema.xsd">
</beans>
xmlns="http://www.ekgc.cn/bean":命名空间的名字xmlns="名字" W3C标 准, 命名空间的名字必须全球唯一性
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance":W3C的官方约束
xsi:schemaLocation="命名空间名 约束文档的路径"
通过提供bean-schema.xsd
编写xml文档。
注意:以下规则不用自己写,只需要把以下规则编写成bean-schema.xsd文件就可以了。
<?xml version="1.0" encoding="UTF-8"?>
<!--
模拟spring规范,如果开发人员需要在xml使用当前Schema约束,必须包括指定命名空间。
格式如下:
<beans xmlns="http://www.coydone.com/bean"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.coydone.com/bean bean-schema.xsd"
>
-->
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.coydone.com/bean"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://www.coydone.com/bean"
elementFormDefault="qualified">
<!-- 声明根标签 -->
<element name="beans">
<complexType>
<choice minOccurs="0" maxOccurs="unbounded">
<element name="bean">
<complexType>
<sequence minOccurs="0" maxOccurs="unbounded">
<element name="property">
<complexType>
<attribute name="name" use="required"></attribute>
<attribute name="value" use="required"></attribute>
</complexType>
</element>
</sequence>
<attribute name="id" use="required"></attribute>
<attribute name="className" use="required"></attribute>
</complexType>
</element>
<element name="import">
<complexType>
<attribute name="resource" use="required"></attribute>
</complexType>
</element>
</choice>
</complexType>
</element>
</schema>
在其同级目录下新建xxx.xml
文件,通过Schema约束写xml文件。
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.coydone.com/bean"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.coydone.com/bean bean-schema.xsd">
<bean id="" className="">
<property name="" value=""/>
<property name="" value=""></property>
</bean>
<bean id="" className="">
<property name="" value=""></property>
</bean>
<import resource=""></import>
</beans>
命名空间(语法)
命名空间概述
如果一个XML文档中使用多个Schema文件,而这些Schema文件中定义了相同名称的元素时就会出现名字冲突。这就像一个Java文件中使用了import java.util.和import java.sql.时,在使用Date类时,那么就不明确Date是哪个包下的Date了。总之名称空间就是用来处理元素和属性的名称冲突问题,与Java中的包是同一用途。如果每个元素和属性都有自己的名称空间,那么就不会出现名字冲突问题,就像是每个类都有自己所在的包一样,那么类名就不会出现冲突。
约束文档和xml关系
当W3C提出Schema约束规范时,就提供“官方约束文档”。我们通过官方文档,必须“自定义schema 约束文档”,开发中“自定义文档”由框架编写者提供。我们提供“自定义文档”限定,编写出自己的xml文档。
声明命名空间(了解)
默认命名空间:,使用<标签>
显式命名空间:<xxx xmlns:别名=””>
,使用<别名:标签>
名称空间声明的一般形式为:第一部分是一个关键字xmlns:,第二部分是名称空间的前缀,第三部分是一个等号,第四部分是双引号,将第五部分的名称空间标识URI包括起来。需要注意的是,名称空间的前缀不能为xml,因为在XML中这个字符串是保留作特殊用途的。例:xmlns:tns="http://www.whtest.com/"
//其中tns为前缀。还可以隐式声明名称空间,即省略掉冒号和名称空间前缀。例:xmlns="http://www.whtest.com/"
//注意在一个文档中只能有一个隐式声明的。
简单示例
Spring中的配置文件applicationContext.xml,如下图:
来看一个复杂的,第一个声明的命名空间就是隐式声明。
评论区