XML是什么

 

 

<!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:ˎ̥; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-alt:"Times New Roman"; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:auto; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;} div.Section1 {page:Section1;} -->

 

现在我们暂且使用 记事本 来创建我们的 XML 文件吧。先看一个 XML 文件:

1:

?xml version="1.0" encoding="gb2312" ?

〈参考资料〉

  〈书籍〉

  〈名称〉 XML 入门精解〈 / 名称〉

  〈作者〉张三〈 / 作者〉

  〈价格 货币单位 =" 人民币 " 20.00 / 价格〉

  / 书籍〉

  〈书籍〉

  〈名称〉 XML 语法〈 / 名称〉

  !-- 此书即将出版 --

  〈作者〉李四〈 / 作者〉

  〈价格 货币单位 =" 人民币 " 18.00 / 价格〉

  / 书籍〉

/ 参考资料〉

这是一个典型的 XML 文件,编辑好后保存为一个以 .xml 为后缀的文件。我们可以将此文件分为文件序言( Prolog )和文件主体两个大的部分。在此文件中的第一行即是文件序言。该行是一个 XML 文件必须要声明的东西,而且也必须位于 XML 文件的第一行,它主要是告诉 XML 解析器如何工作。其中, version 是标明此 XML 文件所用的标准的版本号,必须要有; encoding 指明了此 XML 文件中所使用的字符类型,可以省略,在你省略此声明的时候,后面的字符码必须是 Unicode 字符码(建议不要省略)。因为我们在这个例子中使用的是 GB2312 字符码,所以 encoding 这个声明也不能省略。在文件序言部分还有一些声明语句,我们在后面给予介绍。

文件的其余部分都是属于文件主体, XML 文件的内容信息存放在此。我们可以看到,文件主体是由开始的〈参考资料〉和结束的〈 / 参考资料〉控制标记组成,这个称为 XML 文件的 根元素 ;〈书籍〉是作为直属于根元素下的 子元素 ;在〈书籍〉下又有〈名称〉、〈作者〉、〈价格〉这些子元素。货币单位是〈价格〉元素中的一个 属性 人民币 则是 属性值

!-- 此书即将出版 -- 〉这一句同 HTML 一样,是注释,在 XML 文件里,注释部分是放在 !--” “-- 标记之间的部分。

大家可以看到, XML 文件是相当简单的。同 HTML 一样, XML 文件也是由一系列的标记组成,不过, XML 文件中的标记是我们自定义的标记,具有明确的含义,我们可以对标记中的内容的含义作出说明。

XML 文件有了初步的印象之后,我们就来详细地谈一谈 XML 文件的语法。在讲语法之前,我们必须要了解一个重要的概念,就是 XML 解析器( XML Parse )。

1.XML 解析器

解析器的主要功能就是检查 XML 文件是否有结构上的错误,剥离 XML 文件中的标记,读出正确的内容,以交给下一步的应用程序处理。 XML 是一种用来结构化文件信息的标记语言, XML 规范中对于如何标记文件的结构性有一个详细的法则,解析器就是根据这些法则写出来的软件(多用 Java 写成)。同 HTML 一样,在浏览器中,必须有 HTML 的解析器,这样浏览器才能够 读懂 各种用 HTML 标记所组成的网页,将它们显示在我们面前。如果有浏览器的 HTML 解析器读不懂的标记,将会返回给我们错误信息。

由于现在的 HTML 标记实际上相当混乱,存在大量不规范的标记(有的网页用 IE 能正常显示,而用 Netscape Navigator 则不行),所以从一开始, XML 的设计者就严格规定了 XML 的语法和结构,我们编写的 XML 文件必须遵循这些规定,否则 XML 解析器将毫不留情地给你显示错误信息。

有两种 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 文件。

检查它是否满足了 Well-Formed 的条件。我们可以将刚才编辑的第一个 XML 文件用 IE 5 以上版本的浏览器打开。

大家可能要问为什么在浏览器中的显示和我的源文件一样?没错,因为对于 XML 文件,我们鼋龉匦乃 的内容,而它的显示形式是交给 CSS XSL 来完成的。这里,我们并没有给这个 XML 文件定义它的 CSS XSL 文件,所以它按照原来的形式来显示。实际上,对于电子数据交换,仅仅需要一个 XML 文件即可,如果要将它以某种形式显示出来,我们就必须编辑 CSS XSL 文件(这个问题会在以后讨论)。

2.Well-Formed XML 文件

我们知道, XML 必须是 Well-Formed 的,才能够被解析器正确地解析出来,显示在浏览器中。那么什么是 Well-Formed XML 文件呢?主要有下面几个准则,我们在创建 XML 文件的时候,必须满足它们。

1.XML 文件的第一行必须是声明该文件是 XML 文件以及它所使用的 XML 规范版本。在文件的前面不能够有其它元素或者注释。

2. XML 文件中有且只能够有一个根元素。我们的第一个例子中,〈参考资料〉 ... / 参考资料〉就是此 XML 文件的根元素。

3. XML 文件中的标记必须正确地关闭,也就是说,在 XML 文件中,控制标记必 须有与之对应的结束标记。如:〈名称〉标记必须有对应的〈 / 名称〉结束标记,不像 HTML ,某些标记的结束标记可有可无。如果在 XML 文件中遇到自成一个单元的标记,就是类似于 HTML 中的〈 img src=..... 〉的这些没有结束标记的时候, XML 把它称为 空元素 ,必须用这样的写法:〈空元素名 / 〉,如果元素中含有属性时写法则为:〈空元素名 属性名 =“ 属性值 ”/ 〉。

4. 标记之间不得交叉。在以前的 HTML 文件中,可以这样写:

B 〉〈 H XXXXXXX /B 〉〈 /H , B 〉和〈 H

标记之间有相互重叠的区域,而在 XML 中,是严格禁止这样标记交错的写法,标记必须以规则性的次序来出现。

5. 属性值必须要用 “ ” 号括起来。如第一个例子中的 “1.0” “gb2312” 人民币 。都是用 “ ” 号括起来了的,不能漏掉。

6. 控制标记、指令和属性名称等英文要区分大小写。与 HTML 不同的是,在 HTML 中, 类似〈 B 〉和〈 b 〉的标记含义是一样的,而在 XML 中,类似〈 name 〉、〈 NAME 〉或〈 Name 〉这样的标记是不同的。

7. 我们知道,在 HTML 文件中,如果我们要浏览器原封不动地将我们所输入的东西显示出来,可以将这些东西放到〈 pre 〉〈 /pre 〉或者〈 xmp 〉〈 /xmp 〉标记中间。这对于我们创建 HTML 教学的网页是必不可少的,因为网页中要显示 HTML 的源代码。而在 XML 中,要实现这样的功能,就必须使用 CDATA 标记。在 CDATA 标记中的信息被解析器原封不动地传给应用程序,并且不解析该段信息中的任何控制标记。 CDATA 区域是由: ![CDATA[” 为开始标记,以 “> 为结束标记。例如:例 2 中的源码,除了 ![CDATA[” “> 符号,其余的内容解析器将原封不动地交给下游的应用程序,即使 CDATA 区域中的开始和结尾的空白以及换行字符等,都同样会被转交(注意 CDATA 是大写的字符)。

2:

![CDATA[ 飞翔的 xml 〉〉〉〉〉 ,:-)

oooo 〈〈〈〈〈〈〈

>

8.XML 处理空白字符和 HTML 不一样。 HTML 标准规定,不管有多少个空白,都当作一个空白来处理;而在 XML 中规定,所有标记以外的空白,解析器都要忠实地交给下游的应用程序处理。这样,我们有时必须摒弃编写 HTML 文件时的缩排习惯,因为缩排的空格,解析器也要处理。如:

〈作者〉张三〈 / 作者〉

  〈作者〉

  张三

  / 作者〉

上述内容对于解析器来说是不同的(后者在〈作者〉〈 / 作者〉标记之内除了张三这个字符以外,还包括两个换行记号以及 张三 前的文字缩排符号)。所以解析器在去掉标记后将信息传给应用程序将有不同的处理结果。

如果我们想明确地告诉 XML 程序,标记中的空白有明确的含义,不要随便去掉(如在一些诗中,空格有它具体的意义),则可在标记中加入一个 XML 内置的属性 ——xml:space 。如(注意属性名称和值的大小写):

〈诗歌 xml:space="preserver"

  祖国啊! 祖国!

  我的祖国!

  / 诗歌〉

另外,在 XML 文件中,如果要用到表 1 的特殊字符,必须用相应符号代替。

1:

特殊字符          替代符号

  &&             &

  <             &it;

  >               >

  "              "

  '            &apos;

小结:

符合上述规定的 XML 文件就是 Well-Formed XML 文件。这是编写 XML 文件的最基本要求。可以看到 XML 文件的语法规定比 HTML 要严格多了。由于有这样的严格规定,软件工程师编写 XML 的解析器就容易多了,不像编写 HTML 语言的解析器,必须费尽心思去适应不同的网页写法,提高自己浏览器的适应能力。实际上,这对于我们初学者来说,也是一件好事。该怎样就怎样,不必像原来那样去疑惑各种 HTML 的写法。

我们看到,在 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 的,并且它是正确的依据某个 DTD 建立的,那么,这个 XML 文件就被称为: Validating XML 文件。相应的解析器就称为: Validating Parser

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值