什么是DTD约束:
DTD为英文Document Type Definition,中文意思为“文档类定义”。DTD肩负着两重任务:一方面它帮助你编写合法的代码,另一方面它让浏览器正确地显示器代码
什么是良好的XML
- 有且只有一个根元素
- XML标签大小写正确区分
- 正确使用结束标签
- 正确嵌套标签
- 使用了合法的标签名
- 定义有效的属性
如下:
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person>
<name>张小明</name>
<age>10</age>
<contact>
<phone>1234567</phone>
</contact>
<br/>
</person>
<person>
<name>张大明</name>
<age>35</age>
<contact>
<email>123@qq.com</email>
</contact>
</person>
</persons>
上面这是一个完整且有效的XML
DTD的声明:<! DOCTYPE root [ ]>
元素定义的语法: <!ELEMENT element-name (type)>
(注意:根标签也要定义!!!)
XML中的特殊符号:
- &(逻辑与) &
- <(小于) <
- .>(大于) >
- "(双引号) "
- '(单引号) ’
元素定义的语法:
<!ELEMENT element-name EMPTY> //空元素 <!ELEMENT element-name (#PCDATA)> //文本元素 <!ELEMENT element-name (e1,e2)> //混合元素元素的限制:
, 顺序
| 或者
次数: +, 1~n
*:0~n
?:0或1
无 :子元素只能出现一次
属性定义的语法: <!ATTLIST element-name att_name type >
ID
(男|女)
CDATA
IDREF
reference
#REQUIRED/#IMPLIED
使用DTD定义元素:
代码:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE persons [
<!-- 简单元素:没有子元素的元素 如:约束: (#PCDATA): 约束name是字符串类型
EMPTY : 元素为空(没有内容)
ANY:任意类型
复杂元素:有子元素的元素 如:子元素后面的符号表示子元素出现的次数
+ :表示一次或者多次
? :表示零次或者一次
* :表示零次或者多次
无 :子元素只能出现一次
子元素直接使用逗号进行隔开 ,表示元素出现的顺序
子元素直接使用|隔开,表示元素只能出现其中的任意一个
-->
<!ELEMENT persons (person*) >
<!ELEMENT person (name,age,contact,br?)><!-- 子元素只能出现一次 -->
<!ELEMENT name (#PCDATA) >
<!ELEMENT age (#PCDATA) >
<!ELEMENT contact (phone|email) ><!-- |只能出现一次 -->
<!ELEMENT phone (#PCDATA) >
<!ELEMENT br EMPTY >
]>
<persons>
<person>
<name>张小明</name>
<age>10</age>
<contact>
<phone>1234567</phone>
</contact>
<br/>
</person>
<person>
<name>张大明</name>
<age>35</age>
<contact>
<email>123@qq.com</email>
</contact>
</person>
</persons>
使用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 br EMPTY >
<!ATTLIST person
pid ID #REQUIRED
sex (男|女) '男'
qq CDATA #IMPLIED
parent IDREF #IMPLIED
>
<!--pid:唯一的ID -->
<!--sex:选择类别 默认为男 -->
<!--qq:文本类别 -->
<!--parent:依赖关系 -->
]>
<persons>
<person pid="p1" sex="男" qq="aaa" parent="p2">
<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对config.xml的限制
代码:
<?xml version="1.0" encoding="UTF-8"?>
<!--
config标签:可以包含0~N个action标签
-->
<!--
action标签:可以饱含0~N个forward标签 path:以/开头的字符串,并且值必须唯一 非空 ,子控制器对应的路径
type:字符串,非空,子控制器的完整类名
-->
<!DOCTYPE config[
<!ELEMENT config (action*)>
<!ELEMENT action (forward*)>
<!ELEMENT forward EMPTY>
<!ATTLIST action
path CDATA #REQUIRED
type CDATA #REQUIRED
>
<!ATTLIST forward
name CDATA #REQUIRED
path CDATA #REQUIRED
redirect (true|false) "true"
>
]>
<config>
<action path="/registerAction" type="test.action.RegisterAction">
<forward name="success" path="/index.jsp" redirect="true" />
<forward name="failed" path="/register.jsp" redirect="false" />
</action>
<action path="/loginAction" type="test.action.LoginAction">
<forward name="a" path="/index.jsp" redirect="false" />
<forward name="b" path="/welcome.jsp" redirect="true" />
</action>
</config>
实体:
DTD中允许用户自定义实体,所谓实体定义类似于C语言的宏变量,即为一段字符串数据提供一个别名,实体被声明后,就可在其它地方被引用
DTD中定义的实体,可以在XML文档中引用,也可以在DTD中引用实体类别
实体的作用:
提高代码复用,方便维护
XML中使用一些特殊符号时,会使XML解析器混淆,因此需要为这些符号定义为实体,例如大于或小于符号等,系统已定义好这些实体
对于长度较长并且需要反复使用到的字符串,为了减少字符输入量,可以将其定义为实体
定义内部实体:只能在XML中引用 <!ENTITY 实体名称 “实体值”>
XML中使用实体:&实体名;
引用:&实体名;
DTD中引用参数实体:&实体名;
定义外部实体:不在DTD中定义,在外部文件中指定
<!ENTITY 实体名称 SYSTEM “实体所在文件的URI/URL">Schema介绍
- Schema 是最新的XML文档约束。
- Schema 要比DTD强大很多,是DTD替代者。
- Schema 本身也是XML文档,但Schema文档的扩展名为xsd,而不是xml。
- Schema 功能更强大,数据类型更完善
- Schema 支持名称空间
Schema的快速入门
<?xml version="1.0" encoding="UTF-8"?>
<schema
xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/person"
elementFormDefault="qualified">
</schema>
schema本身是个xml文件,所以必须声明<?xml version="1.0" encoding="UTF-8"?>
xmlns:虽然schema实质是一个xml文件,但是它的后缀名为.xsd,也需要申明它是一个schema约束文件,它是一个固定值"http://www.w3.org/2001/XMLSchema
注意:schema文件中的根元素必须是
书写步骤:
1.判断xml文件中有多少个元素
2.判断是复杂元素还是简单元素
复杂元素:
<element><complexType><sequence></sequence></complexType></element>
简单元素:
<element name=""></element>
<?xml version="1.0" encoding="gbk" standalone="no"?>
<person>
<p1>
<name>张三</name>
<age>20</age>
</p1>
<p2>
<name>李四</name>
<age>25</age>
</p2>
schema的元素及属性
<sequence></sequence>:表示元素有序
<all></all>:表示相同元素只能出现一次
<choice></choice>:表示所有元素只能出现一个
maxOccurs="unbounded":表示元素出现没有限制
<any></any>:表示任意元素
属性标签(复杂元素):<attribute></attribute>
DOM4J简介
- DOM4J是 dom4j.org 出品的一个开源 XML 解析包。DOM4J应用于 Java 平台,采用了 Java 集合框架并完全支持 DOM,SAX 和 JAXP。
- DOM4J 使用起来非常简单。只要你了解基本的 XML-DOM 模型,就能使用。
- Dom:把整个文档作为一个对象。
- DOM4J 最大的特色是使用大量的接口。它的主要接口都在org.dom4j里面定义:
Dom4J的常用方法
- SAXReader 对象 xml文件读取器
- Document read(String path);加载执行xml文档
- Document 对象
- Element getRootElement() :获取根元素对象(根标签)
- Element 对象
- List elements() :获取所有的子元素
- List elements(String name):根据指定的元素名称来获取相应的所有的子元素
- Element element(String name):根据指定的元素名称来获取子元素对象,如果元素名称重复,则获取第一个元素
- String elementText(Stringname) :根据指定的子元素名称,来获取子元素中的文本
- String getText():获取当前元素对象的文本
- String attributeValue(Stringname):根据指定的属性名称获取其对应的值
接口的继承关系:
interface java.lang.Cloneable
interface org.dom4j.Node
interface org.dom4j.Attribute
interface org.dom4j.Branch
interface org.dom4j.Document
interface org.dom4j.Element
interface org.dom4j.CharacterData
interface org.dom4j.CDATA
interface org.dom4j.Comment
interface org.dom4j.Text
interface org.dom4j.DocumentType
interface org.dom4j.Entity
interface org.dom4j.ProcessingInstruction