XML简易教程

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

XML简易教程在Intel的早期,AndyGrove遇到一个雇员-他建议公司在芯片的基础上开发个人计算机。AndyGrove疑问道“个人计算机能做什么呢?”,这个雇员举例说,它可以存储处方。Grove考虑到整个研究、开发和市场费用要数百万美圆,最终决定以为红绿灯提供芯片作为开始。每个人都是事后诸葛亮。AndyGrove,不管你怎样看他,被普遍认为是一个非常聪明的人-能够做出发展公司的重大决定。但是在七十年代,不可能强求他预见到个人计算机的潜力。如果他当时见过Excel、Quark、Photoshop、Oracle或者网络,他就会理解把强大的处理器放在桌面上会允许软件做任何事。但是如果没亲眼见过,谁能想到呢。在用打字机、加法机和铅笔作为计算的工具的时代,你能解释PC和它的用途吗?这个例子可以用在解释扩展标记语言(XML-eXtensibleMarkupLanguage)上。现在还没有和它相似的东西,所以很难做出比较。你可能听说过XML是HTML的替代物或XML与HTML相似,可以定义自己的标记符。这两种说法都不全对,就象说PC是存储处方的机器一样。我妈妈是一个训练有素的厨师,如果我用她的配方,我的家庭会省下很大一笔钱。我以简单的开始。因此我打开文本编辑器,开始写一些HTML代码:HTMLH1ALIGN=CENTERRecipe/H1FONTFACEsize=2ChocolateChipBars/FONT在写完上面几行后,我想接着写我妈妈的精妙菜谱。那么怎么做呢?一份老式的Web页面。接下来呢?把我的页面的URL送给对这个菜谱感兴趣的人们,然后让他们剥掉其中的P和FONTFACEsize=2吗?这得花些时间,我想得到实际的内容。看看下面可能的XML标记:authorCarolSchmidt/authorrecipe_nameChocolateChipBars/recipe_name在XML中,标记符可以最好地描述内容。以这种方式,我可以肯定任何查找出现在recipe_name标记符中的“ChocolateChip”的人都可以得到妈妈_的菜谱。进一步说,如果我的信息被象这样的标记符(有意义的标记符)包围-我可以告诉其它程序如何使用它们。我还可以通过编码把recipe_name标记符中的内容放入数据库的某个域中,然后把它输出到一本书的硬拷贝中。还有,我可以用一个支持XML的字处理器使网页的出版轻而易举。这就是XML的本质:使标记对人和机器都可读。但是在实现这个目标之前,应该理解用XML编码所涉及的东西。文档要组织良好一个XML文件必须满足两点:组织良好和有效。我们以一个组织良好的文档开始。我发明了一些描述菜谱的标记符,并把它们组织成一种合理和可读的方式。它可能不是最好的标记,但是在下面的例子中工作得很好。?xmlversion=1.0?listrecipeauthorCarolSchmidt/authorrecipe_nameChocolateChipBars/recipe_namemealDinnercourseDessert/course/mealingredientsitem2/3Cbutter/itemitem2Cbrownsugar/itemitem1tspvanilla/itemitem13/4Cunsiftedall-purposeflour/itemitem11/2tspbakingpowder/itemitem1/2tspsalt/itemitem3eggs/itemitem1/2Cchoppednuts/itemitem2cups(12-ozpkg.)semi-sweetchoc.chips/item/ingredientsdirectionsPreheatovento350degrees.Meltbutter;combinewithbrownsugarandvanillainlargemixingbowl.Setasidetocool.Combineflour,bakingpowder,andsalt;setaside.Addeggstocooledsugarmixture;beatwell.Stirinreserveddryingredients,nuts,andchips.Spreadingreased13-by-9-inchpan.Bakefor25to30minutesuntilgoldenbrown;cool.Cutintosquares./directions/recipe/list这就是一份可以接受的XML文档-告诉你XML是什么:把数据以一种有实际意义的方式进行组织。虽然这些标记符看起来有点象HTML,但是有很大的区别:文件中没有指出数据如何表示的信息。版面指令,当我们准备好时,就会从其它地方出现。这和把地址簿的信息放在数据库的字段和记录中而不是放在字处理器产生的清单中的道理一样。数据库可以让你把地址簿中的信息合成到标签、信封、信件或其它任何想要的载体上面。最后,就是把这份菜谱文件合成到一种表现语言中,如HTML或CSS。前面说过,XML文档必须组织良好。这意味着文件必须满足以下三项基本规则:文档以XML定义?xmlversion=1.0?开始。有一个包含所有其它内容的根元素,如上面例子中的list和/list标记符。所有元素必须合理地嵌套,不允许交叉嵌套。上面的例子中,几个item元素被合理地嵌套ingredients和/ingredients标记符中。但是下面的标记却有严重的问题:ingredientsitem/ingredientschocolatechips/item于是chocolatechips没有被包含在ingredients清单中。因此这份文档就没有组织好。这在HTML中可能不算什么,因为浏览器已经被设计成可以处理这种问题。但是在XML中却是致命的-应用程序将拒绝处理没有组织好的文件。我们现在知道组织良好非常重要,但是还不止这些文档格式的排错我妈妈_的清单中有数十条菜谱,甚至数百条。如果产生一个致命错误,排错将非常困难-你将一行一行地寻找丢失的标记符。如果使用几层嵌套,发现错误将很困难。但是可以找到很好的帮助。分析器-XML代码和报告格式错误的应用程序可以在网上免费得到。其中最好的是Lark,它的作者是由TimBray-XML规范的技术编辑和极力鼓吹者,地球上最聪明的人之一。我用Lark分析下面的代码。注意chocolatechips和它的关闭标记符出现在/ingredients标记符中的位置有错误:?xmlversion=1.0?listrecipeauthorCarolSchmidt/authorrecipe_nameChocolateChipBars/recipe_namemealDinnercourseDessert/course/mealingredientsitem2/3Cbutter/itemitem2Cbrownsugar/itemitem1tspvanilla/itemitem13/4Cunsiftedall-purposeflour/itemitem11/2tspbakingpowder/itemitem1/2tspsalt/itemitem3eggs/itemitem1/2Cchoppednuts/itemitem/ingredients2cups(12-ozpkg.)semi-sweetchoc.chips/itemdirectionsPreheatovernto350degrees.Meltbutter;combinewithbrownsugarandvanillainlargemixingbowl.Setasidetocool.Combineflour,bakingpowder,andsalt;setaside.Addeggstocooledsugarmixture;beatwell.Stirinreserveddryingredients,nuts,andchips.Spreadingreased13-by-9-inchpan.Bakefor25to30minutesuntilgoldenbrown;cool.Cutintosquares./directions/recipe/list下面是分析器返回的结果:ErrorReportLine17,column22:Encountered/ingredientsexpected/item...assumed/itemLine18,column36:Encountered/itemwithnostart-tag.有了这种信息,找到错误将不会成为问题。那么XML文件的有效性是指什么呢?实现有效性最终我们将在组织良好的XML文档中加入信息。实际上,我们有很多事要做-仍然有危机潜伏-虽然XML文件组织良好,但还可能丢失关键信息。看看下面的例子:recipeauthorCarolSchmidt/authorrecipe_nameChocolateChipBars/recipe_namemealDinnercourseDessert/course/mealingredients/ingredientsdirectionsMeltbutter;combinewith,etc..../directions/recipe这份菜谱中没有包含ingredient,而且因为它组织良好,所以Lark分析器也不会发现问题。管理过哪怕是最和善的数据库的人都知道我们人类常犯的错误:如果有机会,我们会丢掉关键信息并加入无用的废话。这就是为什么XML的发明者引入DTD-文档类型定义(DocumentTypeDefinition)。DTD提供了一种保证XML或多或少是你所想的方法。让我们看看用在菜谱上的一个DTD。!DOCTYPElist[!ELEMENTrecipe(recipe_name,author,meal,ingredients,directions)!ELEMENTingredients(item+)!ELEMENTmeal(#PCDATA,course?)!ELEMENTitem(#PCDATA,sub_item*)!ELEMENTrecipe_name(#PCDATA)!ELEMENTauthor(#PCDATA)!ELEMENTcourse(#PCDATA)!ELEMENTitem(#PCDATA)!ELEMENTsubitem(#PCDATA)!ELEMENTdirections(#PCDATA)]这些代码起初看起来不够友好,但当把它分解时却能看出其中的意义。让我们详细解释之:!DOCTYPElist[这行是说,包含在方括号中的是具有根元素list的某个文档的DTD。如我们以前提到的,根元素包含所有其它元素。!ELEMENTrecipe(recipe_name,meal,ingredients,directions)这行定义了recipe标记符。圆括号是说其中的四种标记符必须按照顺序出现在recipe标记符中。!ELEMENTmeal(#PCDATA,course?)这行需要详细的解释。我定义了以下的结构:mealHerethemealnameismandatorycourseOnecoursenamemayappear,butitisnotmandatory/course/meal我这

1 / 34
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功