在任何一个XML文档中应包括头部(header)和内容(content)这两部分。其中,头部除了要声明所遵循的标准和字符集编码之外,还可以通过引入相关的约束来保证整个文档结构的完整性。目前,比较常用的约束手段有如下三种方式:
1)DTD:XML1.0规范的一部分,简单但不灵活;
2)Schema:灵活但复杂;
3)RELAX NG:针对XML Schema复杂性而产生的一种约束模式,融合了DTD的简单性和XML Schema的灵活性,但不具备XML Schema的全部特性。
DTD的约束主要涉及到元素和当前元素属性的定义,包括:元素的名称、元素所包含的内容、子元素的个数和顺序、元素所具有的属性、属性的数据类型和取值范围等,根据具体的应用,这里所述的内容不是都需在DTD中有所体现。
1.定义元素
包括根元素在内的所有元素都需要利用关键字ELEMENT来定义,其语法如下:
<!ELEMENT 元素名 内容模式 >
其中红色部分的内容为固定不变的,而内容模式是定义当前元素应包含的子元素(组),子元素出现的个数和顺序,以及是否可包含文本内容等。
2.元素的内容模式
即上述内容模式可能是由如下几种情况之一构成的:
1) (子元素1 | 子元素2 | 子元素n) 或 (子元素1,子元素2,子元素n)
其中,“|”号表示元素之间“或”的关系,即表示可以包含子元素1,或子元素2,或子元素3。另外,还可以用逗号“,”来分割,表示这些子元素出现在父元素中的先后次序。
在这种情况下,还可以用“量词”来量化各子元素(组)出现的次数。
? :0次或1次(0|1)
+ :一次或多次(1...N)
* :0次或多次(0...N)
无量词作用时,则默认表示有且必须出现一次。
例如:
<!ELEMENT a(sa?) >表示子元素sa在元素a中那么不出现,要么只出现一次,而<!ELEMENT a(sa,sb,sc)+ >则表示sa、sb和sc至少依次嵌套在a元素中一次。
2) (#PCDATA)
表示当前元素只能包含纯文本内容。
例如,针对元素a,
<a>test</a>、<a></a>和</a>都是合法的,
而<a><sa>test<sa></a>是非法的。
3) EMPTY
表示当前元素不能包含任何嵌套的子元素和文本内容。例如,针对元素a,只有在<a />和<a></a>这两种情况下是合法的。
4) ANY
表示当前元素可以包含任意数量和顺序的子元素和文本内容。在这种情况下,和没有引入DTD时是一样的效果,只要遵循XML文档结构的基本规则即可。
在定义元素时,内容模式部分是不能被省略的。例如,当我们定义一个bean元素时,即使对它内部嵌套没有明确的内容约束时,也需要在最后加上ANY来加以说明:<!ELEMENT bean ANY >
上述的内容模式还可以组合使用,例如<!ELEMENT bean (a|(b*,c)+)? >。
3.定义元素的属性
定义元素的属性是通过关键字ATTLIST来进行的,其语法如下:
<!ATTLIST 元素名 属性名 属性值类型/取值范围 是否可选>
其中红色部分的内容为固定不变的,元素名是指拥有这些属性的元素,而“属性名 属性值类型/取值范围 是否可选”是定义某一个属性所必须具备的三要素,称为属性列表。另外,当前元素的所有属性都应该在同一个<!ATTLIST >中定义,这意味着当有n个属性时,则应该在同一个<!ATTLIST >中定义n个属性列表。
4.属性列表
1)属性名
即一般的文本值,只要符合XML基本的规范即可。
2)属性值类型/取值范围 当某个属性无明确的取值范围时,则需指定该属性值的类型,一般就是一个文本类型CDATA;当某个属性有明确的取值范围时,则必须用括号“()”将所有备选值括起来,并且备选值之间用“|”分割,表示这是一个n选一的操作。例如:
type (string | int | boolean)
表示type属性值只能是string、int或boolean。
3)是否可选
可用#REQUIRED(必选)或#IMPLIED(可选)来表示,根据实际的应用场景来设置即可。例如: type CDATA #REQUIRED
表示必选的type属性的值为任意的文本字符。
5.定义DTD
temple.dtd
<?xml version="1.0" encoding="UTF-8"?> <!-- 定义XML根元素temple,其内有0个或多个bean元素 --> <!ELEMENT templet (bean*)> <!-- 1.定义bean元素,其内有0个或多个property元素 2.定义bean元素属性: 1)name 任意文本值 可选 2)class 任意文本值 必选 --> <!ELEMENT bean (property*)> <!ATTLIST bean name CDATA #IMPLIED class CDATA #REQUIRED > <!-- 1.定义property元素,无任何嵌套的子元素和文本内容 2.定义property元素属性: 1)name 任意文本值 必选 2)type 括号内所指定的某一个值 可选 3)ref 任意文本值 可选 --> <!ELEMENT property EMPTY > <!ATTLIST property name CDATA #REQUIRED type ( java:boolean | java:byte | java:char | java:double | java:float | java:long | java:integer | java:short | java:string ) #IMPLIED ref CDATA #IMPLIED >
6.引入DTD
在某个XML文件头中,可通过<!DOCTYPE来引入相应的DTD文件,它有两种引入方式:
1)远程引入
DTD文件可能是在一个公用的网络目录上,供若干个互联网用户共同使用。其语法如下:
<!DOCTYPE DTD标识符 PUBLIC "DTD公共标识" "DTD系统标识" >
其中红色部分为远程引入时的固定写法。
DTD标识符:可以为任意字符串,不过一般就取名为DTD中定义的根元素名称;
PUBLIC:远程引入的关键字
DTD公共标识:以“-//”开头。
DTD系统标识:一般就是用来指定DTD文件的URI。当公共标识无法解析时,则就用系统标识来进行。
例如,Struts2的DTD引入如下:
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
2)本地引入
即引入用户系统中定义的DTD文件,其语法如下:
<!DOCTYPE DTD标识符 SYSTEM "DTD文件路径" >
其中红色部分为远程引入时的固定写法。
DTD标识符:(与远程引入的规则一样)
SYSTEM:本地引入的关键字
DTD文件路径:DTD相对于当前XML文件的路径
例如,将第5部分定义的temple.dtd放到与temple.xml的同一个目录下后,在XML引入如下内容:
<?xml version="1.0" encoding="UTF-8"?> <!-- 引入本地的DTD文件 --> <!DOCTYPE temple SYSTEM "temple.dtd"> <temple> <bean name="user" class="com.daniele.appdemo.test.domain.User"> <property name="id" type="java:long" /> <property name="name" type="java:string" /> <property name="age" type="java:integer"/> <property name="mail" type="java:string" /> </bean> </temple>在Eclipse中,当我们在文档的相应位置键入"Alt"+"/"组合键后,将会看到一系列的备选值,而这些备选值就是在temple.dtd定义的。
相关推荐
为了确保XML文档的结构正确性与一致性,XML约束技术应运而生,主要有两种形式:DTD(Document Type Definition)和XML Schema。 **DTD(Document Type Definition)** DTD是XML的早期约束和验证机制,它定义了XML...
DTD约束是XML文档规范的一种方式,它允许我们定义元素、属性以及它们之间的关系,以实现对XML文档内容的有效控制。 DTD的主要组成部分包括: 1. 元素定义:在DTD中,每个元素都有一个唯一的名称,可以指定元素是否...
2. tv-.xml和tv-.dtd:这两个文件展示了如何使用DTD来定义XML文档的结构和约束,并使用DTD来验证XML文档的有效性。 3. poems.xml和.dtd:这两个文件展示了如何使用DTD来定义XML文档的结构和约束,并使用DTD来验证...
XML Schema是XML的一种标准化约束机制,用于定义XML文档的结构和数据类型,确保数据的准确性和一致性。 XML Schema提供了比早期的DTD(Document Type Definition)更强大的功能,例如支持复杂数据类型、命名空间和...
在这个“优秀xml课程设计”中,我们将会深入探讨XML的基础知识,包括其结构、语法以及如何使用DTD(Document Type Definition)来定义XML文档的结构。 XML的基本结构由元素(Element)、属性(Attribute)、文本...
- **外部DTD**:DTD作为单独的文件存在,并通过XML文档中的DOCTYPE声明来引用。适用于大型项目或多个文档共享相同的DTD规则的情况。 #### 五、DTD的声明 DTD声明总是以`<!DOCTYPE>`开头,后跟根元素的名称。内部...
这是一个jdom解析xml的小例子、里面还有dtd文件的编写以及dtd文件约束xml文件。这是一个jdom解析xml的小例子、里面还有dtd文件的编写以及dtd文件约束xml文件。这是一个jdom解析xml的小例子、里面还有dtd文件的编写...
**DTD(Document Type Definition)** 是XML(Extensible Markup Language)文档类型定义的缩写,它是XML规范的一部分,用于定义XML文档的结构和元素。在XML文档中,DTD的作用是确保文档内容遵循预设的规则,即所有...
DTD是一种元语言,用于定义XML文档的合法构建块。在Spring和Mybatis的XML配置文件中,DTD定义了可以使用的元素、属性以及它们的顺序和限制。这些约束确保了配置文件的正确性,避免了因语法错误导致的解析问题。 ...
XML文档类型定义(DTD)是XML文档结构的重要组成部分,它为XML文档设定了规范和约束,确保了数据的准确性和一致性。本教程旨在深入讲解DTD的概念、编写方式、使用方法,以及它与XML Schema的区别和联系。 XML的核心...
DTD定义了XML文档的元素类型、元素之间的关系以及元素可能具有的属性,从而约束了XML文档的结构,防止因结构混乱导致的数据解析错误。通过使用DTD,可以对XML文档进行验证,检查文档是否符合预先设定的规则,这对于...
DTD(Document Type Definition)是XML文档的一个重要组成部分,它定义了文档结构和元素之间的关系,确保XML文件遵循一套预定义的规则。DTD约束文档的作用在于为XML文档提供了一个验证的标准,使得XML解析器能够检查...
编写DTD约束有两种方式:一是将DTD定义作为单独的文件,二是将DTD嵌入到XML文档本身中。在XML文档内部编写DTD时,使用`<!DOCTYPE>`声明,如示例所示,将DTD定义放在`<?xml>`声明之后,文档元素之前。 XML Schema是...
XML Schema 和 XML DTD 是两种用于定义XML文档结构和数据约束的语言。XML DTD(文档类型定义)是较早出现的规范,而XML Schema则在2001年成为W3C的正式推荐标准,旨在提供更强大和灵活的XML文档验证功能。 首先,...
DTD是XML的一个组成部分,用于定义XML文档的结构和元素约束,但并非所有情况下都需要进行验证。在这种情况下,我们可以采取一些策略来忽略DTD验证,从而避免`System.Xml.XmlException`的抛出。 首先,我们可以使用`...
在XML中,DTD(Document Type Definition)是用来定义XML文档结构和元素规则的规范,它允许我们声明元素类型、元素间的约束以及属性等,确保XML文档的数据结构正确无误。 本堂实践课的主题是“XML文档引用外部DTD”...
在本主题中,我们将深入探讨如何利用DTD(Document Type Definition)和XML Schema来设计一个表示图书信息的XML文档。这两种方法都是为了确保XML文档结构的合法性与一致性。 首先,DTD是XML的早期验证机制,它定义...
DTD是一种用于定义XML文档结构的机制,它定义了元素、属性以及它们之间的关系。在MyBatis的上下文中,DTD文件用于确保XML映射文件(mapper.xml)遵循特定的格式和规则,这样解析器在处理这些文件时就能正确理解其...
接下来是DTD(Document Type Definition),它是XML文档类型定义,用来规定XML文档的合法结构和元素。DTD通过一系列的元素声明、属性声明和实体定义,确保XML文档遵循特定的规则。例如,它可以定义元素是否可以嵌套...
2、熟悉和掌握XML规范的基本内容,包括XML声明、注释、处理指令、元素、属性、CDATA段、预定义实体、命名空间的使用,以及如何进行XML文档良构和有效性验证;能够灵活地使用XML层次数据来表示各种信息。 3、掌握如何...