Java程序员从笨鸟到菜鸟之(二十四)Xml基础详解和DTD验证_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > Java程序员从笨鸟到菜鸟之(二十四)Xml基础详解和DTD验证

Java程序员从笨鸟到菜鸟之(二十四)Xml基础详解和DTD验证

 2012/4/23 12:40:40  qcyycom  程序员俱乐部  我要评论(0)
  • 摘要:Xml基础详解Xml:可扩展标记语言(ExtensibleMarkupLanguage,XML),用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML是标准通用标记语言(SGML)的子集,非常适合Web传输。XML提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。Xml的基本语法:1任何的起始标签都必须有一个结束标签。2可以采用另一种简化语法,可以在一个标签中同时表示起始和结束标签
  • 标签:程序 程序员 详解 Java XML

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?文档中,也可作为一个外部引用。?

内部的?DOCTYPE?声明

  ??假如?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?元素有四个元素:"tofromheading,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:?  

[html]?view plaincopy
  1. <?xml?version="1.0"?>?  ??
  2. ??
  3. <!DOCTYPE?note?SYSTEM?"note.dtd">?  ??
  4. ??
  5. <note>?  ??
  6. ??
  7. <to>Tove</to>?  ??
  8. ??
  9. <from>Jani</from>?  ??
  10. ??
  11. <heading>Reminder</heading>?  ??
  12. ??
  13. <body>Don't?forget?me?this?weekend!</body>?  ??
  14. ??
  15. </note>???


这是包含?DTD?的?"note.dtd"?文件:?  

[html]?view plaincopy
  1. <!ELEMENT?note?(to,from,heading,body)>?  ??
  2. ??
  3. <!ELEMENT?to?(#PCDATA)>?  ??
  4. ??
  5. <!ELEMENT?from?(#PCDATA)>?  ??
  6. ??
  7. <!ELEMENT?heading?(#PCDATA)>?  ??
  8. ??
  9. <!ELEMENT?body?(#PCDATA)>??

?

?

下面来看一下DTDxml每一个模块中的定义:

在一个?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>

发表评论
用户名: 匿名