XML文件格式简介(经典篇)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
〈!ELEMENT element-name element-definition〉
〈!ELEMENT:表示开始元素设置,注意此处 ELEMENT 关键字是大写。
element-name:表示要设置的元素的名称。
element-definition:指明要对此元素进行怎样的定义,就是说〈元素〉...〈/元素〉之间能够包含什么 内容,是其他元素还是一般性的文字。
使用了 DTD,那么文件中的根元素就在这里指定。
[.........]〉 :在[ ]标记里面定义 XML 文件使用元素,然后用〉结束 DTD 的定义。
下面,我们来看一下怎样给 XML 文件定义 DTD,请见例 1。
例 1 中的 DTD 定义区可以看作是一个 DTD 定义的大概框架,为其他 XML 文件定义 DTD,结构和例 1 的 DTD 差不多,只是可能需要添加、删除或者更改一些东西而已。在 DTD 定义的中间是元素设定,这是一个 DTD 的最主要部分,其主要语法如下:
我们看到,在 XML 文件中,用的大多都是自定义的标记。但是大家考虑一下,如果两个同行业的公司 A 和 B 要用 XML 文件相互交换数据,A 公司用 〈价格〉标记来表示他们产品的价格信息,而 B 公司可能用 〈售价〉来表示价格信息。如果一个 XML 应用程序来读取他们各自的 XML 文件中的信息时,如果它只知道 〈价格〉标记里表示的是价格信息,那么 B 公司的价格信息就读不出来,必将产生错误。显然,对于想利 用 XML 文件来交换信息的实体来说,他们之间必须有 一个约定——即编写 XML 文件可以用哪些标记,母 元素中能够包括哪些子元素,各个元素出现的顺序,元素中的属性怎样定义等。这样他们在用 XML 交换数 据时才能够畅通无阻。这种约定称为 DTD(Document Type Definition,文档格式定义)。可以把 DTD 看作编写 XML 文件的模板。对于同行业之间的 XML 数据交换,有一个固定的 DTD 将会方便很多。比如 说, 如果网上的各大电子商场的 XML 网页都遵循同一个 DTD 时,那么我们就可以轻松地依据这个 DTD 编写一 个应用程序,去网上将我们感兴趣的东西自动抓回来。事实上已经有了好几个定义好的 DTD,如前面所说 的 MathML、SMIL 等。
有两种 XML 文件,一种是 Well-Formed XML 文件,一种是 Validating XML 文件。
如果一个 XML 文件满足 XML 规范中的某些相关法则,且没有使用 DTD(文件格式定义——后详述)时, 可称这份文件是 Well-Formed。 而如果一个 XML 文件是 Well-Formed,且正确地使用了 DTD,DTD 中的语 法又是正确的,那么这个文件就是 Validating。对应两种 XML 文件,有两种 XML 解析器,一种是 Well-Formed 解析器,一种是 Validating 解析器。IE 5 中就内含 Validating 解析器,Validating 解析 器也可用来解析 Well-Formed XML 文件。
第四,标记之间不得交叉。在以前的 HTML 文件中,可以这样写:
〈B〉〈H〉XXXXXXX〈/B〉〈/H〉,〈B〉和〈H〉
标记之间有相互重叠的区域,而在 XML 中,是严格禁止这样标记交错的写法,标记必须以规则性的次 序来出现。
第五,属性值必须要用“ ”号括起来。如第一个例子中的“1.0”、“gb2312”、“人民币”。都是 用“ ”号括起来了的,不能漏掉。
检查它是否满足了 Well-Formed 的条件。我们可以将刚才编辑的第一个 XML 文件用 IE 5 以上版本 的浏览器打开。
大家可能要问为什么在浏览器中的显示和我的源文件一样?没错,因为对于 XML 文件,我们仅仅关心 它的的内容,而它的显示形式是交给 CSS 或 XSL 来完成的。这里,我们并没有给这个 XML 文件定义它的 CSS 或 XSL 文件,所以它按照原来的形式来显示。实际 上,对于电子数据交换,仅仅需要一个 XML 文件即可, 如果要将它以某种形式显示出来,我们就必须编辑 CSS 或 XSL 文件(这个问题会在以后讨论)。
如果一个 XML 文件是 Well-Formed 的,并且它是正确的依据某个 DTD 建立的,那么,这个 XML 文件就 被称为:Validating XML 文件。相应的解析器就称为:Validating Parser。
DTD 实际上可以看作一个或多个 XML 文件的模板,这些 XML 文件中的元素、元素的属性、元素 的 排列方式/顺序、元素能够包含的内容等,都必须符合 DTD 中的定义。XML 文件中的元素,即我们所创建的 标记,是根据我们应用的实际情况来创建的。想要创建一份完整性高、适应性广的 DTD 是非常困难的,因 为各行各业都有他们自己的行业特点,所以 DTD 通常是以某种应用领域为定义的范围,如:医学、建筑、 工 商、行政。DTD 定义的元素含盖范围越广泛,那么就越复杂。
DTD 可以是一个完全独立的文件,也可以在 XML 文件中直接设定。所以,DTD 分为外部 DTD(在 XML 文件中调用另外已经编辑好的 DTD)和内部 DTD(在 XML 文件中直接设定 DTD)两种。比如,有几十 家相互联系的、合作伙伴关系的公司、厂商,他们相互之间的交换电子文档都是用 XML 文档。那么我们可 以将这些 XML 文档的 DTD 放在某个地方,让所有交换的 XML 文档都使用此 DTD,这是最方便的做法,同时 也适用于公司内部的 XML 文件使用。
内部 DTD
内部 DTD 是在 XML 文件的文件序言区域中定义的。语法:
〈!DOCTYPE element-name[........
]〉
〈!DOCTYPE :表示开始设定 DTD,注意 DOCUTYPE 是大写。
Element-name :指定此 DTD 的根元素的名称,一个 XML 文件只能有一个根元素。注意,如果 XML 文件
对 XML 文件有了初步的印象之后,我们就来详细地谈一谈 XML 文件的语法。在讲语法之前,我们必须 要了解一个重要的概念,就是 XML 解析器(XML Parse)。
1.XML 解析器
解析器的主要功能就是检查 XML 文件是否有结构上的错误,剥离 XML 文件中的标记,读出正确的内容, 以交给下一步的应用程序处理。XML 是一种用来结构化文件信息的标记语言,XML 规范中对于如何标记文件 的结构性有一个详细的法则,解析器就是根据这些法则写出来的软件(多用 Java 写成)。同 HTML 一样, 在浏览器中,必须有 HTML 的解析器,这样浏览器才能够“读懂”各种用 HTML 标记所组成的网页,将它们 显示在我们面前。如果有浏览器的 HTML 解析器读不懂的标记,将会返回给我们错误信息。
〈诗歌 xml:space="preserver"〉 祖国啊! 祖国! 我的祖国! 〈/诗歌〉
另外,在 XML 文件中,如果要用到表 1 的特殊字符,必须用相应符号代替。
表1
特殊字符 替代符号 && & < ⁢ >> "" ''
பைடு நூலகம்
在此做个小结:符合上述规定的 XML 文件就是 Well-Formed 的 XML 文件。这是编写 XML 文件的最基本 要求。可以看到 XML 文件的语法规定比 HTML 要严格多了。由于有这样的严格规定,软件工程师编写 XML 的 解析器就容易多了,不像编写 HTML 语言的解析器,必须费尽心思去适应不同的网页写法,提高自己浏览器 的适应能力。实际上,这对于我们初学者来说,也是一件好事。该怎样就怎样,不必像原来那样去疑惑各 种 HTML 的写法。
例2
〈![CDATA[飞翔的 xml〉〉〉〉〉,:-) oooo〈〈〈〈〈〈〈 >〉
第八,XML 处理空白字符和 HTML 不一样。HTML 标准规定,不管有多少个空白,都当作一个空白来处理; 而在 XML 中规定,所有标记以外的空白,解析器都要忠实地交给下游的应用程序处理。这样,我们有时必 须摒弃编写 HTML 文件时的缩排习惯,因为缩排的空格,解析器也要处理。如:
在元素设置中,如果元素包含多个子元素,如:〈!ELEMENT 书籍 (名称,作者,价格)〉这种含多个子元 素的声明,那么“名称”、“作者”、“价格”这些标记在 XML 文件中必须以上面排列的顺序出现,每个 标记必须而且只能够出现一次。如果在设定元素时,按照〈!ELEMENT 书籍 ANY〉,这样在元素下就可以 包含任意被设定过的元素,出现的次数和顺序也不受限制,并且在该元素下,除了可以包含子元素以外, 还能够包含一般的文字。有时候,在 XML 文件中,一个标记可能多次出现(或者不出现),那么我们除了 在它们的父元素中用 ANY 关键字之外,还可以在元素的旁边加上特定的符号来控制标记出现的次数。这些 符号见表 1。
第二,在 XML 文件中有且只能够有一个根元素。我们的第一个例子中,〈参考资料〉... 〈/参考资 料〉就是此 XML 文件的根元素。
第三,在 XML 文件中的标记必须正确地关闭,也就是说,在 XML 文件中,控制标记必须有与之对应的 结束标记。如:〈名称〉标记必须有对应的〈/名称〉结束标记,不像 HTML,某些标记的结束标记可有可 无。如果在 XML 文件中遇到自成一个单元的标记,就是类似于 HTML 中的〈img src=.....〉的这些没有 结束标记的时候,XML 把它称为“空元素”,必须用这样的写法:〈空元素名/〉,如果元素中含有属性时 写法则为:〈空元素 名 属性名=“属性值”/〉。
由于现在的 HTML 标记实际上相当混乱,存在大量不规范的标记(有的网页用 IE 能正常显示,而用 Netscape Navigator 则不行),所以从一开始,XML 的设计者就严格规定了 XML 的语法和结构,我们编写 的 XML 文件必须遵循这些规定,否则 XML 解析器将 毫不留情地给你显示错误信息。
在例 1 中,大家可以看到,〈!ELEMENT 参考资料 (书籍)〉这个元素设定是声明了“参考资料”这个元 素,并且它是作为“书籍”这个元素的父元素。〈!ELEMENT 书籍 (名称,作者,价格)〉这个元素设定声 明了“书籍”这个元素,并且它是作为“名称”、“作者”、“价格”这三个元素的父元素。而〈!ELEMENT 名 称 (#PCDATA)〉这个元素设定声明了“名称”这个元素,但是此元素仅仅包含一般文字,是基本元素,这 是由#PCDATA 关键字定义的。
〈作者〉张三〈/作者〉 和 〈作者〉 张三 〈/作者〉
上述内容对于解析器来说是不同的(后者在〈作者〉〈/作者〉标记之内除了张三这个字符以外,还包 括两个换行记号以及“张三”前的文字缩排符号)。所以解析器在去掉标记后将信息传给应用程序将有不 同的处理结果。
如果我们想明确地告诉 XML 程序,标记中的空白有明确的含义,不要随便去掉(如在一些诗中,空格 有它具体的意义),则可在标记中加入一个 XML 内置的属性——xml:space 。如(注意属性名称和值的大 小写):
第六,控制标记、指令和属性名称等英文要区分大小写。与 HTML 不同的是,在 HTML 中, 类似〈B〉 和〈b〉的标记含义是一样的,而在 XML 中,类似〈name〉、〈NAME〉或〈Name〉这样的标记是不同的
第七,我们知道,在 HTML 文件中,如果我们要浏览器原封不动地将我们所输入的东西显示出来,可以 将这些东西放到〈pre〉〈/pre〉或者 〈xmp〉〈/xmp〉标记中间。这对于我们创建 HTML 教学的网页是必 不可少的,因为网页中要显示 HTML 的源代码。而在 XML 中,要实现这样的功能, 就必须使用 CDATA 标记。 在 CDATA 标记中的信息被解析器原封不动地传给应用程序,并且不解析该段信息中的任何控制标记。CDATA 区域是由:“〈! [CDATA[”为开始标记,以“>〉”为结束标记。例如:例 2 中的源码,除了“〈![CDATA[” 和“>〉”符号,其余的内容解析器将原封不动地交给下游的应用程序,即使 CDATA 区域中的开始和结尾的 空白以及换行字符等,都同样会被转交(注意 CDATA 是大写的字符)。
2.Well-Formed 的 XML 文件
我们知道,XML 必须是 Well-Formed 的,才能够被解析器正确地解析出来,显示在浏览器中。那么什 么是 Well-Formed 的 XML 文件呢?主要有下面几个准则,我们在创建 XML 文件的时候,必须满足它们。
首先,XML 文件的第一行必须是声明该文件是 XML 文件以及它所使用的 XML 规范版本。在文件的前面 不能够有其它元素或者注释。