天天看点

XML知识点滴(5)

XML知识点滴(5)

(引用文章,版权归作者,如需删除请联系我)

行尾处理

n         XML数据经常以文本的方式保存在计算机文件中,以行来分隔。然而,不同的计算机系统采用的行分隔符是不同的。在XML空白字符中,有两个是标准的ASCII码行尾控制字符:回车(CR,#xA)和换行(LF,#xD)。在Windows平台下,采用#xD#xA的组合作为行分隔符,而Linux、Unix系统则采用#xA作为行分隔符,在MacOS下,采用#xD作为行分隔符。

n         为了简化应用程序的工作,XML处理器在解析前,要将所有的两个字符序列#xD#xA,以及单独的#xD字符转换成单个的#xA字符。

语言标识

n         在文档处理中,标识出其内容所使用的自然或人工语言常常是很有用的。

n         可以在文档中插入一个特殊的属性xml:lang,来指出XML文档中任何元素的内容和属性的值所使用的语言。在有效的文档中,这个属性和其他任何属性一样,在使用时必须声明。

n         xml:lang属性的值是在IETF RFC3066(Tags for the Identification of Language)或它的后续版本中定义的语言标识符,另外,也可以为其指定空字符串。例如:

              <content xml:lang=”en”>This is English</content>

              <content xml:GramE">”zh”>窗前明月光</content>

n         属性xml:lang所指的语言适用于它所在元素的所有属性及元素内容,除非被该元素内容中的另一个元素的xml:lang的实例所覆盖。我们可以为一个子元素的xml:lang属性赋一个空值,来覆盖其父元素上的xml:lang属性设置。在该子元素内,将没有可用的语言信息,就好象在它自身及其祖先元素(父元素、父元素的父元素等等)上没有指定xml:lang属性一样。

n         xml:lang的一个简单声明可以采用如下形式:

              xml:lang NMTOKEN #IMPLIED

       不过,如果合适的话,也可以给出指定的缺省值。在一本供英国学生使用的法文诗歌集中,注解(gloss)和笔记(note)使用英语,xml:lang属性可以声明如下:

              <!ATTLIST Poem xml:lang NMTOKEN ‘fr’>

              <!ATTLIST gloss xml:lang NMTOKEN ‘en’>

              <!ATTLIST note xml:lang NMTOKEN ‘en’>

格式良好的XML

n         如果一个XML文档有且只有一个根元素,符合XML元素嵌套规则,满足XML规范中定义的所有格式正确性的约束,并且在文档中直接或间接引用的每一个已分析实体都是格式正确的,我们称这个文档是一个格式良好(well-formed)的XML文档。

n         为什么格式良好的XML是如此重要呢?主要是因为:

1)        可以创建没有DTD的XML文档,便于利用XML文档做数据的交换。

2)        XML的处理器可以做的很小很快,从而应用于手持设备,例如:PDA、手机等存储容量较小的设备中。

n         如果一份XML文档通过了DTD 或Schema的验证,则称其为有效的(Valid)。

DTD

n         DTD(Document Type Definition),文档类型定义。是用于描述、约束XML文档结构的一种方法。

n         在XML标准中,描述了如何创建DTD,以及如何将它与根据它的规则所编写的XML文档相关联,并且还定义了XML处理器应该如何对DTD进行处理。有了DTD就可以检测XML文档的结构是否正确。

n         DTD为XML文档的编写者和处理者提供了共同遵循的原则,使得与文档相关的各种工作有了统一的标准。

在XML文档中引入DTD

n         通过在XML文档中包含文档类型声明,来建立当前文档和DTD的关联。当进行有效性验证的XML处理器读到该指令时,它获取DTD,并根据其中定义的规则对文档进行检验。文档类型声明必须位于XML声明之后,且在根元素(文档元素)之前。不过,在XML声明和文档类型声明之间可以插入注释和处理指令。

n         我们可以直接在XML文档中定义DTD,也可以通过URI引用外部的DTD文件,或者同时采用这两种方式。

内部DTD

n         文档类型声明由<!开始,后面紧跟一个关键字DOCTYPE,然后文档根元素的名称,接下来是标记声明块,标记声明块是放在左中括号([)和右中括号(])之间的,由一个或多个标记声明构成,最后由>结束。

<?xml version=”1.0” encoding=”gb2312” standalone=”yes”?>

<!DOCTYPE greeting[

<!ELEMENT greeting(#PCDATA)>

]>

n         在DTD中,所有的关键字都是大写的。不过,在DTD中定义的元素和属性的大小写是可以任意指定的,但是要注意,因为XML文档是大小写相关的,所以一旦给一个元素命名,那么在整个文档中要使用相同的大小写。例如:greeting和Greeting是两个不同的元素名。

n         在XML文档中定义DTD,比较直观,修改也比较方便,而且不用担心XML处理器找不到DTD,但是它也有一些缺点:

1)        在文档中定义DTD会导致文档本身的长度增加,在传输数据时,即使不需要验证文档的有效性,这些声明也会随着文档一起传输。

2)        如果多个XML文档要共用一个DTD,我们就需要在每一个文档中加如DTD,这是相当繁琐的。

外部DTD

n         在文档类型声明时,用关键字SYSTEM或PUBLIC来指出外部DTD文件的位置。使用SYSTEM关键字的声明语法如下:

              <!DOCTYPE 根元素的名字 SYSTEM “外部DTD文件的URI”>

SYSTEM关键字表示文档使用的是私有的DTD文件,“外部DTD文件的URI”可以是相对URI或绝对URI,相对URI是相对于文档类型声明所在文档的位置。“外部DTD文件的URI”这部分也被称为系统标识符(system identifier)。下面是使用一个外部DTD文件的例子:

              <!DOCTYPE greeting SYSTEM “hello.dtd”>

n         如果位于不同位置的多个XML文档要使用同一个DTD,我们可以使用绝对URI来指明DTD文件的地址。假定hello.dtd位于http://localhost/xml/hello.dtd,可以在文档类型声明中使用URI:

              <!DOCTYPE greeting SYSTEM “http://localhost/xml/hello.dtd”>

       如果引用DTD的XML文档与DTD文件在同一个Web服务器上,我们也可以使用相           对URL:

              <!DOCTYPE greeting SYSTEM “/xml/dtds/hello.dtd”>

              <!DOCTYPE greeting SYSTEM “/dtds/hello.dtd”>

              <!DOCTYPE greeting SYSTEM “../hello.dtd”>

       上面的三种形式都是允许的。

n         使用PUBLIC关键字的声明语法如下:

       <!DOCTYPE 根元素的名字 PUBLIC “DTD的名称” “外部DTD文件的URI”>

PUBLIC关键字用于声明公共的DTD,并且这个DTD还有一个名称,“DTD的名称”也称为公共标识符(public identifier)。这个DTD可以存放在某个公共的地方,XML处理程序会根据名称按照某种方式去检索DTD,如果XML处理器不能根据名称检索到DTD,就会使用“外部DTD文件的URI”(系统标识符)来查找该DTD。

n         DTD名称与XML名称略有不同,它们只能包含ASCII字母和数字字符、空格、回车符、换行符和一些标点符号:-‘()+,./:=?!*#@$_%。

n         公共DTD名称要遵守一些约定。如果一项DTD是ISO标准,它的名称要以字符串“ISO”开始。如果是一个非ISO的标准组织批准的DTD,它的名称以加号(+)开始。如果不是标准组织批准的DTD,它的名称以连字符(-)开始。这些开始字符或字符串后接双斜杠(//)和DTD所有者的名字,之后是另一个双斜杠和DTD描述的文档类型,接着又是一个双斜杠后接ISO 639语言标识符,如EN表示英语,ZH表示中文。在http://www.ics.uci.edu/pub/ietf/http/related/iso639.txt处有完整的ISO639标识符。

n         例如我们定义的人力资源DTD可以采用下面的命名:

       -//BEER//DTD HR 1.0//ZH

       连字符(-)表示这个DTD不是由任何标准组织批准的,为BEER所有,描述的是人力 资源管理,用中文编写。完整的文档类型声明如下:

       <!DOCTYPE HR PUBLIC “-//BEER//DTD HR 1.0//ZH” “http://localhost/xml/dtds/hr.dtd”>

n         HTML网页的文档类型声明,如下:

              <!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01//EN”

              “http://www.w3.org/TR/html4/strict.dtd”>

n         W3C公布的在Web文档中使用的有效的文档类型声明列表可以在

       http://www.w3.org/QA/2002/04/valid-dtd-list.html上找到。

n         文档类型声明与文档类型定义不是一个概念,DTD是文档类型定义(Document Type Definition)的英文缩写。<!DOCTYPE greeting SYSTEM “hello.dtd”>是文档类型声明,<!ELEMENT greeting(#PCDATA)>这种语法是文档类型定义。文档类型声明可以包含(内部DTD子集)或引用(外部DTD子集)一个文档类型的定义,但文档类型定义从不包含文档类型声明。

n         在前面我们提到,如果我们的文档不依赖于外部文档,在XML声明中,可以通过standalone=”yes”来声明这个文档是独立的文档。如果文档依赖于外部文档,可以通过standalone=”no”来声明。当我们使用外部DTD文件时,就需要将属性standalone的值设置为“no”。

n         在实际应用中,很少使用standalone属性,它的主要用途是作为XML处理器和其他应用程序的标志,表示是否需要获取外部内容,如果文档依赖于外部文档,即使我们不使用standalone属性,XML处理器也能够很好地进行处理。

DTD的结构

n         DTD的结构一般由元素类型声明、属性列表声明、实体声明、记号(notation)声明等构成。一个典型的文档类型定义文件会把将来所要创建的XML文档的元素结构、属性类型、实体引用等预先进行定义。

继续阅读