Xml基础详解和DTD验证
2012-05-02 22:11 java线程例子 阅读(375) 评论(0) 编辑 收藏 举报本篇文章是从曹胜欢的博客http://blog.csdn.net/csh624366188转载的
Xml基础详解
Xml:可扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 XML是标准通用标记语言 (SGML) 的子集,非常适合 Web 传输。XML 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。
Xml的基本语法:
1 任何的起始标签都必须有一个结束标签。
2 可以采用另一种简化语法,可以在一个标签中同时表示起始和结束标签。这种语法是在大于符号之前紧跟一个斜线(/),例如<tag/ >。XML解析器会将其翻译成<tag></tag>。
3 标签必须按合适的顺序进行嵌套,所以结束标签必须按镜像顺序匹配起始标签,例如this is a samplestring。这好比是将起始和结束标签看作是数学中的左右括号:在没有关闭所有的内部括号之前,是不能关闭外面的括号的。
4 所有的特性都必须有值。
5 所有的特性都必须在值的周围加上双引号。
6.对于XML文档来说,<?处理指令必须要顶格写,前面不能有任何的空白。
7. XML元素可以具有属性,属性的形式为:
属性名=”属性值”,比如gender=”male”
属性值需要使用单引号或双引号括起来。多个属性之间使用空格分开。
8. 通过样式,我们可以实现XML内容与展现形式的分离
9. XML的注释:<!-- comments --> ,注释不允许嵌套
10. 在一个元素上,相同的属性只能出现一次。
注意以下几点:
1.XML中的每个元素都是成对出现的(有开始,有结束),<student> </student>,XML中的元素嵌套关系要保持正确性,即先开始的标记要先结束,后开始的标记要后结束。
2. 每一个XML文档都有且只有一个根元素(Root Element)。所谓根元素,就是唯一一个包含了其他所有元素的元素。
3. XML描述的是文档的内容与语义,而不是文档应当如何显示。
4.格式正规(well formed)的XML文档。符合XML语法要求的XML文档就是格式正规的XML文档。
5. 有效的(valid)XML文档。首先XML文档是个格式正规的XML文档,然后又需要满足DTD的要求,这样的XML文档称为有效的XML文档
6. #PCDATA (Parsed Character Data),可解析的字符数据。
XML文件的验证机制——DTD
文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。
DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。
假如 DTD 被包含在您的 XML 源文件中,它应当通过下面的语法包装在个DOCTYPE 声明中:
<!DOCTYPE根元素 [元素声明]>
带有 DTD 的 XML 文档实例
<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)> ]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend</body>
</note>
以上 DTD 解释如下:!DOCTYPE note (第二行)定义此文档是 note 类型的文档。
!ELEMENT note (第三行)定义 note 元素有四个元素:"to、from、heading,、body"
!ELEMENT to (第四行)定义 to 元素为 "#PCDATA" 类型
!ELEMENT from (第五行)定义 from 元素为 "#PCDATA" 类型
!ELEMENT heading (第六行)定义 heading 元素为 "#PCDATA" 类型
!ELEMENT body (第七行)定义 body 元素为 "#PCDATA" 类型
假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中: <!DOCTYPE 根元素 SYSTEM "文件名"> 这个 XML 文档和上面的 XML 文档相同,但是拥有一个外部的 DTD:
- <?xml version="1.0"?>
- <!DOCTYPE note SYSTEM "note.dtd">
- <note>
- <to>Tove</to>
- <from>Jani</from>
- <heading>Reminder</heading>
- <body>Don't forget me this weekend!</body>
- </note>
这是包含 DTD 的 "note.dtd" 文件:
- <!ELEMENT note (to,from,heading,body)>
- <!ELEMENT to (#PCDATA)>
- <!ELEMENT from (#PCDATA)>
- <!ELEMENT heading (#PCDATA)>
- <!ELEMENT body (#PCDATA)>
下面来看一下DTD在xml每一个模块中的定义:
在一个 DTD 中,元素通过元素声明来进行声明。
声明一个元素
在 DTD 中,XML 元素通过元素声明来进行声明。元素声明使用下面的语法:
<!ELEMENT 元素名称 类别>
或者 <!ELEMENT 元素名称 (元素内容)>
空元素
空元素通过类别关键词EMPTY进行声明:
<!ELEMENT 元素名称 EMPTY>
只有 PCDATA 的元素
只有 PCDATA 的元素通过圆括号中的 #PCDATA 进行声明: <!ELEMENT 元素名称 (#PCDATA)>
带有任何内容的元素
通过类别关键词 ANY 声明的元素,可包含任何可解析数据的组合: <!ELEMENT 元素名称 ANY>
带有子元素(序列)的元素
带有一个或多个子元素的元素通过圆括号中的子元素名进行声明: <!ELEMENT 元素名称 (子元素名称 1)> 或者 <!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)>
语法格式为: <!ELEMENT element-name (child-name+)>
例: <!ELEMENT note (message+)>
例中的+是指子元素message必须在被包含的note元素里出现一次或者多次。
语法格式为:
<!ELEMENT element-name (child-name*)>
例: <!ELEMENT note (message*)>
例中的*是指子元素message能够在被包含的note元素里不出现或者出现多次。
在 DTD 中,属性通过 ATTLIST 声明来进行声明。
声明属性
属性声明拥使用下列语法:
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
以下是属性类型的选项:
类型 描述
CDATA 值为字符数据 (character data)
(en1|en2|..) 此值是枚举列表中的一个值
ID 值为唯一的 id
IDREF 值为另外一个元素的 id
IDREFS 值为其他 id 的列表
NMTOKEN 值为合法的 XML 名称
NMTOKENS 值为合法的 XML 名称的列表
ENTITY 值是一个实体
ENTITIES 值是一个实体列表
NOTATION 此值是符号的名称
xml: 值是一个预定义的 XML 值
默认值参数可使用下列值:
值 解释
值 属性的默认值
#REQUIRED 属性值是必需的
#IMPLIED 属性不是必需的
#FIXED value 属性值是固定的
规定一个默认的属性值
DTD:
<!ELEMENT square EMPTY>
<!ATTLIST square width CDATA "0">
合法的 XML:
<square width="100" />
在上面的例子中,"square" 被定义为带有 CDATA 类型的 "width" 属性的空元素。如果宽度没有被设定,其默认值为0 。
实体是用于定义引用普通文本或特殊字符的快捷方式的变量。 实体引用是对实体的引用。
实体可在内部或外部进行声明。
语法:
<!ENTITY 实体名称 "实体的值">
DTD 例子:
<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright >
具体的url">XML 例子: <author>&writer;©right;</author>
注释: 一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (;)。
语法:
<!ENTITY 实体名称 SYSTEM "URI/URL">
DTD 例子:
<!ENTITY writer SYSTEM "具体的url">
<!ENTITY copyright SYSTEM "具体的url">XML
例子: <author>&writer;©right;</author>