XML
什么是XML
-
HTML:超文本标记语言:用来表示
-
XML是指可扩展标记语言(eXtensible Markup Language),它是一种标记语言,很类似HTML。它被设计的宗旨是传输数据,而非显示数据。是一种通用的数据交换格式。JSON
-
XML技术是W3C组织(World Wide Web Consortium万维网联盟)发布的,目前遵循的是W3C组织于2000年发布的XML1.0规范。
-
XML标签没有被预定义,需要用户自行定义标签。
-
应用
-
数据交换格式
-
配置文件
-
XML常见应用
-
XML技术除用于描述有关系的数据
-
在Java开发中,传统的配置文件是*.properties属性文件(key=value),而XML表示的数据更为丰富。
-
还经常用作软件配置文件,以描述程序模块之间的关系。(如后面将要学习到的Struts、Spring和Hibernate都是基于XML作为配置文件的)
-
在一个软件系统中,通过XML配置文件可以提高系统的灵活性。即程序的行为是通过XML文件来配置的,而不是硬编码
XML语法
<?xml version="1.0" encoding="UTF-8"?> <persons> <person pid="p1" sex="男" qq="12345"> <name>刘德华</name> <age>10</age> <contact> <phone>1234567</phone> </contact> <br/> </person> <person pid="p2"> <name>张惠妹</name> <age>35</age> <contact> <email>123@qq.com</email> </contact> </person> </persons>
XML声明是XML文档的第一句,其格式如下
<?xml version="1.0" encoding="UTF-8"?>
区分大小写
XML文档有且只有一个根元素
案例中为persons
属性值使用引号
在HTML代码里面,属性值可以加引号,也可以不加。但是XML规定,所有属性值必须加引号(可以是单引号,也可以是双引号,建议使用双引号),否则将被视为错误。
所有的标记必须有相应的结束标记
在HTML中,标记可以不成对出现,而在XML中,所有标记必须成对出现,有一个开始标记,就必须有一个结束标记,否则将被视为错误
DTD
XML技术中,可以编写一个文档来约束一个XML的书写规范,这个文档称之为约束。
常用的约束技术
-
XML DTD
-
DTD(Document Type Definition):文档类型定义
-
这种约束文件的扩展为:dtd
-
-
XML Schema
-
DTD替代技术
-
这种约束文件的扩展为:xsd
-
DTD语法
DTD文档的语法主要涉及以下内容的定义:
-
元素
-
定义属性
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE persons[ <!ELEMENT persons (person+)> <!ELEMENT person (name,age,contact,br?)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ELEMENT contact (phone|email)> <!ELEMENT phone (#PCDATA)> <!ELEMENT email (#PCDATA)> <!ELEMENT br EMPTY> <!ATTLIST person pid ID #REQUIRED sex (男|女) "男" qq CDATA #IMPLIED > ]> <persons> <person pid="p1" sex="男" qq="12345"> <name>刘德华</name> <age>10</age> <contact> <phone>1234567</phone> </contact> <br/> </person> <person pid="p2"> <name>张惠妹</name> <age>35</age> <contact> <email>123@qq.com</email> </contact> </person> </persons>
编写DTD的方式
-
内部DTD
<!DOCTYPE 根元素[]> <!DOCTYPE persons[]>
DTD约束文档可以在XML文档中直接定义,也可以作为单独的文档进行编写(单独的文档必须以UTF-8编码进行保存)
-
引用外部DTD
-
当引用的DTD文档在本地时,采用如下方式:
<!DOCTYPE 根元素 SYSTEM "DTD文档路径">
对应的DTD文档格式
<!ELEMENT persons (person+)> <!ELEMENT person (name,age,contact,br?)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ELEMENT contact (phone|email)> <!ELEMENT phone (#PCDATA)> <!ELEMENT email (#PCDATA)> <!ELEMENT br EMPTY> <!ATTLIST person pid ID #REQUIRED sex (男|女) "男" qq CDATA #IMPLIED >
-
当引用的DTD文档在公共网络上时,采用如下方式:
<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的URL">
-
例如1:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
-
例如2:
-
在gitee上面创建dtd文件
-
查看DTD原始位置
-
在Eclipse中添加xml catalog
-
-
在xml文件引用外部DTD
-
引入外部公共DTD: <!DOCTYPE 根元素 public publicId url>
-
引入外部本地DTD: <!DOCTYPE 根元素 SYSTEM "文件名">
-
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE persons PUBLIC "http://com.donkee.persons" "https://gitee.com/donkee99/config-demo/raw/master/persons.dtd"> <persons> </persons>
DTD-定义元素
-
在DTD文档中使用ELEMENT关键字来声明一个XML元素。
语法:<!ELEMENT 元素名称 使用规则>
-
使用规则:
-
(#PCDATA):指示元素的主体内容只能是普通的文本.(Parsed Character Data)
-
EMPTY:用于指示元素的主体为空。比如
-
ANY:用于指示元素的主体内容为任意类型。
-
(子元素):指示元素中包含的子元素
-
定义子元素及描述它们的关系:
-
如果子元素用逗号分开,说明必须按照声明顺序去编写XML文档。
如: <!ELEMENT person (name,age,contact,br?)>
-
如果子元素用“|”分开,说明任选其一。
<!ELEMENT contact (phone|email)>
-
用+、*、?来表示元素出现的次数
-
如果元素后面没有+*?:表示必须且只能出现一次
-
+:表示至少出现一次,一次或多次
-
*:表示可有可无,零次、一次或多次
-
?:表示可以有也可以无,有的话只能有一次。零次或一次
-
<!ELEMENT persons (person+)> <!ELEMENT person (name,age,contact,br?)>
DTD--定义属性
-
属性值类型:
-
CDATA:表示属性的取值为普通的文本字符串
-
-
ENUMERATED (DTD没有此关键字):表示枚举,只能从枚举列表中任选其一,如 (男|女)
-
ID:表示属性的取值不能重复
-
设置说明
-
#REQUIRED:表示该属性必须出现
-
#IMPLIED:表示该属性可有可无
-
#FIXED:表示属性的取值为一个固定值。语法:#FIXED "固定值"
-
直接值:表示属性的取值为该默认值
-
总结
总结本章内容
作业
-
编写以下config.xml文件对应的DTD约束
<?xml version="1.0" encoding="UTF-8"?> <config> <action path="/userRegAction" type="com.donkee.action.UserRegAction"> <forward name="success" path="/reg.jsp" redirect="true" /> <forward name="failed" path="/index.jsp" redirect="false" /> </action> <action path="/userLoginAction" type="com.donkee.action.UserLoginAction"> <forward name="success" path="/login.jsp" redirect="false" /> <forward name="b" path="/welcome.jsp" redirect="true" /> </action> <action path="/userAction" type="com.donkee.action.UserAction"> <forward name="list" path="/user_list.jsp" redirect="false" /> <forward name="b" path="/welcome.jsp" redirect="true" /> </action> </config>
-
写一个DTD限制servlet相应的DTD约束a
<servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>com.donkee.action.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/HelloServlet</url-pattern> </servlet-mapping>