<?xml version="1.0" encoding="gb2312"?>

<!-- RSS generated by oioj.net on 4/16/2004 ; 感谢LeXRus提供 RSS 2.0 文档; 此文件可自由使用，但请保留此行信息 --> 
<!-- Source download URL: http://blogger.org.cn/blog/rss2.asp       -->
<rss version="2.0">

<channel>
<title>leslie_kent的博客</title>
<link>http://blogger.org.cn/blog/blog.asp?name=leslie_kent</link>
<description>leslie_kent的博客</description>
<copyright>blogger.org.cn</copyright>
<generator>W3CHINA Blog</generator>
<webMaster>webmaster@blogger.org.cn</webMaster>
<item>
<title><![CDATA[XML入门精解之结构与语法]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=leslie_kent&amp;id=16643</link>
<author>leslie_kent</author>
<pubDate>2006/7/14 23:32:53</pubDate>
<description><![CDATA[&nbsp;&nbsp;&nbsp;【简&nbsp;介】<BR>　　XML文件和HTML文件一样，实际上是一个文本文件。显然大家立刻就会明白，创建XML文件最普通的工具和HTML一样，就是“记事本”了。除了“记事本”之外，当然还有一些更加方便的工具，如XML&nbsp;Notepad、XML&nbsp;Pro、CLIP！XML&nbsp;Editor等，这些工具的一大特点是：能够检查你所建立的XML文件是否符合XML规范。不过，现在这些工具都只有英文版的，并且需要付费使用。当然，你仍然能够使用FrontPage、DreamWeaver等工具，不过使用起来不是很方便。随着XML的逐渐普及，相信在不久后，也会出现非常好用的创建XML文件的工具。<BR>　现在我们暂且使用“记事本”来创建我们的XML文件吧。先看一个XML文件：&nbsp;<BR>　　例1&nbsp;
<P>　　〈?xml&nbsp;version="1.0"&nbsp;encoding="gb2312"&nbsp;?〉&nbsp;<BR>　　&nbsp;〈参考资料〉&nbsp;<BR>　　&nbsp;〈书籍〉&nbsp;<BR>　　&nbsp;〈名称〉XML入门精解〈/名称〉&nbsp;<BR>　　&nbsp;〈作者〉张三〈/作者〉&nbsp;<BR>　　&nbsp;〈价格&nbsp;货币单位="人民币"〉20.00〈/价格〉&nbsp;<BR>　　&nbsp;〈/书籍〉&nbsp;<BR>　　&nbsp;〈书籍〉&nbsp;<BR>　　&nbsp;〈名称〉XML语法〈/名称〉&nbsp;<BR>　　&nbsp;〈!--此书即将出版--〉&nbsp;<BR>　　&nbsp;〈作者〉李四〈/作者〉&nbsp;<BR>　　&nbsp;〈价格&nbsp;货币单位="人民币"〉18.00〈/价格〉&nbsp;<BR>　　&nbsp;〈/书籍〉&nbsp;<BR>　　&nbsp;〈/参考资料〉&nbsp;</P>
<P>　　这是一个典型的XML文件，编辑好后保存为一个以.xml为后缀的文件。我们可以将此文件分为文件序言（Prolog）和文件主体两个大的部分。在此文件中的第一行即是文件序言。该行是一个XML文件必须要声明的东西，而且也必须位于XML文件的第一行，它主要是告诉XML解析器如何工作。其中，version是标明此XML文件所用的标准的版本号，必须要有；encoding指明了此XML文件中所使用的字符类型，可以省略，在你省略此声明的时候，后面的字符码必须是Unicode字符码（建议不要省略）。因为我们在这个例子中使用的是GB2312字符码，所以encoding这个声明也不能省略。在文件序言部分还有一些声明语句，我们在后面给予介绍。&nbsp;</P>
<P>　　文件的其余部分都是属于文件主体，XML文件的内容信息存放在此。我们可以看到，文件主体是由开始的〈参考资料〉和结束的〈/参考资料〉控制标记组成，这个称为XML文件的“根元素”；〈书籍〉是作为直属于根元素下的“子元素”；在〈书籍〉下又有〈名称〉、〈作者〉、〈价格〉这些子元素。货币单位是〈价格〉元素中的一个“属性”，“人民币”则是“属性值”。&nbsp;</P>
<P>　　〈!--此书即将出版--〉这一句同HTML一样，是注释，在XML文件里，注释部分是放在“〈!--”与“--〉”标记之间的部分。&nbsp;</P>
<P>　　大家可以看到，XML文件是相当简单的。同HTML一样，XML文件也是由一系列的标记组成，不过，XML文件中的标记是我们自定义的标记，具有明确的含义，我们可以对标记中的内容的含义作出说明。&nbsp;</P>
<P>　　对XML文件有了初步的印象之后，我们就来详细地谈一谈XML文件的语法。在讲语法之前，我们必须要了解一个重要的概念，就是XML解析器（XML&nbsp;Parse）。&nbsp;<BR>　　1.XML解析器&nbsp;</P>
<P>　　解析器的主要功能就是检查XML文件是否有结构上的错误，剥离XML文件中的标记，读出正确的内容，以交给下一步的应用程序处理。XML是一种用来结构化文件信息的标记语言，XML规范中对于如何标记文件的结构性有一个详细的法则，解析器就是根据这些法则写出来的软件（多用Java写成）。同HTML一样，在浏览器中，必须有HTML的解析器，这样浏览器才能够“读懂”各种用HTML标记所组成的网页，将它们显示在我们面前。如果有浏览器的HTML解析器读不懂的标记，将会返回给我们错误信息。&nbsp;</P>
<P>　　由于现在的HTML标记实际上相当混乱，存在大量不规范的标记（有的网页用IE能正常显示，而用Netscape&nbsp;Navigator则不行），所以从一开始，XML的设计者就严格规定了XML的语法和结构，我们编写的XML文件必须遵循这些规定，否则XML解析器将毫不留情地给你显示错误信息。&nbsp;</P>
<P>　　有两种XML文件，一种是Well-Formed&nbsp;XML文件，一种是Validating&nbsp;XML文件。&nbsp;</P>
<P>　　如果一个XML文件满足XML规范中的某些相关法则，且没有使用DTD（文件格式定义——后详述）时，可称这份文件是Well-Formed。而如果一个XML文件是Well-Formed，且正确地使用了DTD，DTD中的语法又是正确的，那么这个文件就是Validating。对应两种XML文件，有两种XML解析器，一种是Well-Formed&nbsp;解析器，一种是Validating解析器。IE&nbsp;5中就内含Validating解析器，Validating解析器也可用来解析Well-Formed&nbsp;XML文件。&nbsp;</P>
<P>　　检查它是否满足了Well-Formed的条件。我们可以将刚才编辑的第一个XML&nbsp;文件用IE&nbsp;5以上版本的浏览器打开。&nbsp;</P>
<P>　　大家可能要问为什么在浏览器中的显示和我的源文件一样？没错，因为对于XML文件，我们鼋龉匦乃&nbsp;的内容，而它的显示形式是交给CSS或XSL来完成的。这里，我们并没有给这个XML文件定义它的CSS或XSL文件，所以它按照原来的形式来显示。实际上，对于电子数据交换，仅仅需要一个XML文件即可，如果要将它以某种形式显示出来，我们就必须编辑CSS或XSL文件（这个问题会在以后讨论）。&nbsp;</P>
<P>　　2.Well-Formed的XML文件&nbsp;</P>
<P>　　我们知道，XML必须是Well-Formed的，才能够被解析器正确地解析出来，显示在浏览器中。那么什么是Well-Formed的XML文件呢？主要有下面几个准则，我们在创建XML文件的时候，必须满足它们。&nbsp;</P>
<P>　　首先，XML文件的第一行必须是声明该文件是XML文件以及它所使用的XML规范版本。在文件的前面不能够有其它元素或者注释。&nbsp;</P>
<P>　　第二，在XML文件中有且只能够有一个根元素。我们的第一个例子中，〈参考资料〉...&nbsp;〈/参考资料〉就是此XML文件的根元素。&nbsp;</P>
<P>　　第三，在XML文件中的标记必须正确地关闭，也就是说，在XML文件中，控制标记必&nbsp;须有与之对应的结束标记。如：〈名称〉标记必须有对应的〈/名称〉结束标记，不像HTML，某些标记的结束标记可有可无。如果在XML文件中遇到自成一个单元的标记，就是类似于HTML&nbsp;中的〈img&nbsp;src=.....〉的这些没有结束标记的时候，XML把它称为“空元素”，必须用这样的写法：〈空元素名/〉，如果元素中含有属性时写法则为：〈空元素名&nbsp;属性名=“属性值”/〉。&nbsp;</P>
<P>　　第四，标记之间不得交叉。在以前的HTML文件中，可以这样写：&nbsp;</P>
<P>　　〈B〉〈H〉XXXXXXX〈/B〉〈/H〉,〈B〉和〈H〉&nbsp;</P>
<P>　　标记之间有相互重叠的区域，而在XML中，是严格禁止这样标记交错的写法，标记必须以规则性的次序来出现。&nbsp;</P>
<P>　　第五，属性值必须要用“&nbsp;”号括起来。如第一个例子中的“1.0”、“gb2312”、“人民币”。都是用“&nbsp;”号括起来了的，不能漏掉。&nbsp;</P>
<P>　　第六，控制标记、指令和属性名称等英文要区分大小写。与HTML不同的是，在HTML中，&nbsp;类似〈B〉和〈b〉的标记含义是一样的，而在XML中，类似〈name〉、〈NAME〉或〈Name〉这样的标记是不同的</P>
<P>　　第七，我们知道，在HTML文件中，如果我们要浏览器原封不动地将我们所输入的东西显示出来，可以将这些东西放到〈pre〉〈/pre〉或者〈xmp〉〈/xmp〉标记中间。这对于我们创建HTML教学的网页是必不可少的，因为网页中要显示HTML的源代码。而在XML中，要实现这样的功能，就必须使用CDATA标记。在CDATA标记中的信息被解析器原封不动地传给应用程序，并且不解析该段信息中的任何控制标记。CDATA区域是由：“〈![CDATA[”为开始标记，以“&gt;〉”为结束标记。例如：例2中的源码，除了“〈![CDATA[”和“&gt;〉”符号，其余的内容解析器将原封不动地交给下游的应用程序，即使CDATA区域中的开始和结尾的空白以及换行字符等，都同样会被转交（注意CDATA是大写的字符）。&nbsp;<BR>　　例2&nbsp;</P>
<P>　　〈![CDATA[飞翔的xml〉〉〉〉〉,:-)&nbsp;<BR>　　&nbsp;oooo〈〈〈〈〈〈〈&nbsp;<BR>　　&nbsp;&gt;〉&nbsp;</P>
<P>　　第八，XML处理空白字符和HTML不一样。HTML标准规定，不管有多少个空白，都当作一个空白来处理；而在XML中规定，所有标记以外的空白，解析器都要忠实地交给下游的应用程序处理。这样，我们有时必须摒弃编写HTML文件时的缩排习惯，因为缩排的空格，解析器也要处理。如：&nbsp;</P>
<P>　　&nbsp;〈作者〉张三〈/作者〉&nbsp;<BR>　　&nbsp;和&nbsp;<BR>　　&nbsp;〈作者〉&nbsp;<BR>　　&nbsp;张三&nbsp;<BR>　　&nbsp;〈/作者〉&nbsp;</P>
<P>　　上述内容对于解析器来说是不同的（后者在〈作者〉〈/作者〉标记之内除了张三这个字符以外，还包括两个换行记号以及“张三”前的文字缩排符号）。所以解析器在去掉标记后将信息传给应用程序将有不同的处理结果。&nbsp;</P>
<P>　　如果我们想明确地告诉XML程序，标记中的空白有明确的含义，不要随便去掉（如在一些诗中，空格有它具体的意义），则可在标记中加入一个XML内置的属性——xml:space&nbsp;。如（注意属性名称和值的大小写）：&nbsp;　　&nbsp;</P>
<P>　　〈诗歌&nbsp;xml:space="preserver"〉&nbsp;<BR>　　&nbsp;祖国啊！&nbsp;祖国！&nbsp;<BR>　　&nbsp;我的祖国！&nbsp;<BR>　　&nbsp;〈/诗歌〉&nbsp;</P>
<P>　　另外，在XML文件中，如果要用到表1的特殊字符，必须用相应符号代替。&nbsp;</P>
<P>　　表1&nbsp;</P>
<P>　　特殊字符&nbsp;替代符号&nbsp;<BR>　　&nbsp;&amp;&amp;&nbsp;&amp;&nbsp;<BR>　　&nbsp;&lt;&nbsp;&amp;it;&nbsp;<BR>　　&nbsp;&gt;&nbsp;&gt;&nbsp;<BR>　　&nbsp;"&nbsp;"&nbsp;<BR>　　&nbsp;'&nbsp;&amp;apos;&nbsp;</P>
<P>　　在此做个小结：符合上述规定的XML文件就是Well-Formed的XML文件。这是编写XML文件的最基本要求。可以看到XML文件的语法规定比HTML要严格多了。由于有这样的严格规定，软件工程师编写XML的解析器就容易多了，不像编写HTML语言的解析器，必须费尽心思去适应不同的网页写法，提高自己浏览器的适应能力。实际上，这对于我们初学者来说，也是一件好事。该怎样就怎样，不必像原来那样去疑惑各种HTML的写法。&nbsp;</P>
<P>　　我们看到，在XML文件中，用的大多都是自定义的标记。但是大家考虑一下，如果两个同行业的公司A和B要用XML文件相互交换数据，A公司用〈价格〉标记来表示他们产品的价格信息，而B公司可能用〈售价〉来表示价格信息。如果一个XML应用程序来读取他们各自的XML文件中的信息时，如果它只知道〈价格〉标记里表示的是价格信息，那么B公司的价格信息就读不出来，必将产生错误。显然，对于想利用XML文件来交换信息的实体来说，他们之间必须有一个约定——即编写XML文件可以用哪些标记，母元素中能够包括哪些子元素，各个元素出现的顺序，元素中的属性怎样定义等。这样他们在用XML交换数据时才能够畅通无阻。这种约定称为DTD（Document&nbsp;Type&nbsp;Definition，文档格式定义）。可以把DTD看作编写XML文件的模板。对于同行业之间的XML数据交换，有一个固定的DTD将会方便很多。比如说，如果网上的各大电子商场的XML网页都遵循同一个DTD时，那么我们就可以轻松地依据这个DTD&nbsp;编写一个应用程序，去网上将我们感兴趣的东西自动抓回来。事实上已经有了好几个定义好的DTD，如前面所说的MathML、SMIL等。&nbsp;</P>
<P>　　如果一个XML文件是Well-Formed的，并且它是正确的依据某个DTD建立的，那么，这个XML文件就被称为：Validating&nbsp;XML文件。相应的解析器就称为：Validating&nbsp;Parser。</P>]]></description>
</item>
</channel>
</rss>