文档css选择器
css选择器 时间:2021-05-22 阅读:(
)
XML入门经典(第5版)[美]JoeFawcettLiamR.
E.
QuinDannyAyers著刘云鹏王超译北京JoeFawcett,LiamR.
E.
Quin,DannyAyersBeginningXML,5thEditionEISBN:978-1-118-16213-2Copyright2012byJohnWiley&Sons,Inc.
,Indianapolis,IndianaAllRightsReserved.
Thistranslationpublishedunderlicense.
本书中文简体字版由WileyPublishing,Inc.
授权清华大学出版社出版.
未经出版者书面许可,不得以任何方式复制或抄袭本书内容.
北京市版权局著作权合同登记号图字:01-2013-2511CopiesofthisbooksoldwithoutaWileystickeronthecoverareunauthorizedandillegal.
本书封面贴有Wiley公司防伪标签,无标签者不得销售.
版权所有,侵权必究.
侵权举报电话:010-6278298913701121933图书在版编目(CIP)数据XML入门经典(第5版)/(美)福思特(Fawcett,J.
),(美)奎思(Quin,L.
R.
E.
),(美)艾尔斯(Ayers,D.
)著;刘云鹏,王超译.
—北京:清华大学出版社,2013书名原文:BeginningXML,5thEditionISBN978-7-302-34271-7Ⅰ.
①X…Ⅱ.
①福…②奎…③艾…④刘…⑤王…Ⅲ.
①可扩充语言—程序设计Ⅳ.
①TP312中国版本图书馆CIP数据核字(2013)第249404号责任编辑:王军杨信明装帧设计:孔祥峰责任校对:成凤进责任印制:出版发行:清华大学出版社网址:http://www.
tup.
com.
cn,http://www.
wqbook.
com地址:北京清华大学学研大厦A座邮编:100084社总机:010-62770175邮购:010-62786544投稿与读者服务:010-62776969,c-service@tup.
tsinghua.
edu.
cn质量反馈:010-62772015,zhiliang@tup.
tsinghua.
edu.
cn印刷者:装订者:经销:全国新华书店开本:185mm*260mm印张:44.
25字数:1188千字版次:2013年12第1版印次:2013年12月第1次印刷印数:1~4000定价:98.
00元产品编号:译者序物竞天择,适者生存——在以计算机与互联网技术为代表的IT时代,各种各样的新技术如雨后春笋般涌现,然而真正能够历经磨练生存下来的却寥寥无几.
毫无疑问,XML便是其中的佼佼者.
尽管在XML诞生之前,已经出现了SGML.
作为标记语言历史上的一个里程碑,SGML拥有如同超文本标记语言(HTML)一样的历史地位.
虽然SGML强大的灵活性使其可以适用于各种不同场景,但它还是不可避免地遭受失败.
原因很简单,它太复杂了.
正如OSI模型最终被TCP/IP打败一样,XML的诞生标志着SGML的彻底失败.
XML来源于SGML的一个子集,保留了灵活性,去掉了复杂性.
很快XML便获得了巨大的成功,XML标准开始突飞猛进地发展,大批的软件开发商争先恐后地采纳这个标准,这一切令人叹为观止.
如今XML在IT领域已经拥有无可动摇的地位,很难想象有一个重要的应用程序不使用XML来保存它的配置文件或数据文件.
作为XML技术的经典读物,本书几乎囊括与XML相关的一切.
从XML诞生与发展到XML的定义与构造;从XML的验证(DTD、XMLSchema、RELAXNG和Schematron)到XML的处理(XPATH和XSLT);从与数据库的结合(XQuery)到在通信中的应用(RSS、SOAP、WSDL和AJAX).
这些错综复杂的知识点在作者笔下以一种循序渐进的方式串联起来,并以一种游刃有余的方式向读者娓娓道来.
所谓庖丁解牛,大抵如此.
更为难能可贵的是,在本书中作者使用了平实朴素的语言辅以大量真实可信的实例来帮助读者消化理解一些艰难晦涩的知识点,使读者能够从一名初学者晋升为一名专家.
在本书的翻译过程中,我无时无刻不被作者渊博的学识与贴切的教授方式所折服.
作者似乎总能找到一些极富代表性的简单实例来阐述一些难点,通过实例的练习,读者能够更加深刻体会这些难点.
所谓大道至简,大抵如此.
作为本书的第五版,其覆盖内容相较于第四版有了极大的改动.
主要原因在于在过去的几年中XML不断地进化,围绕在XML周边的技术也是日新月异,以至于作者在写作第五版时竟然发现有四分之三的内容已经过时.
本着严谨的治学态度,作者对第四版内容进行了大幅度的修编,补充了当今最前沿最流行的技术.
这些新增的内容便构成了本书第五版的基础.
所谓与时俱进,大抵如此.
时光荏苒,岁月如梭.
回想自己初识XML是在大三的编程课上,迄今已多年.
在此期间,本人先后积累了几段不同的学习经历,无论是在实验室使用C++开发了人生第一个大型应用服务器,还是在互联网公司使用php与C++编写了基于搜索的后台转码服务器,抑或是现在正在经历的使用Java开发分布式监控平台.
可以说,每个阶段的学习与工作都离不开XML的身影,而本人也在这些经历中积累了丰富的XML开发经验.
正是由于与XML的这种亲密接触才使得本人有信心有动力完成本书的翻译工作.
翻译是一项考验人耐力与信心的工作,厚厚的一本书承载了本人与另一位译者的心血;翻译又是一项充满挑战的工作,正是XML入门经典(第5版)II由于它的挑战性,才能够使我们有勇气第一次如此系统地学习XML技术.
此时此刻,再一次向大家真诚地推荐这本书,只要静下心来细细品味,你就能真正理解这本经典所蕴含的无穷魅力.
本书的另一位译者王超多年来一直醉心于数据库方面的研究工作.
在本书的翻译过程中,二人相互配合,建立了深厚的友谊.
没有他,本人断然不能完成如此浩大的翻译工作,再次真诚地对其说一声感谢.
同时感谢我们的母校北京邮电大学,感谢它多年的培养,带领我们进入了IT技术的殿堂.
本书的翻译工作均在业余时间完成,因此牺牲了许多本应陪伴家人的时间,在此感谢他们的理解和支持.
最后,感谢清华大学出版社李阳编辑对我的信任,将如此重要的工作交予本人,并在翻译过程中提出了许多宝贵的意见和建议.
本书全部章节由刘云鹏、王超翻译,参与翻译活动的还有孔祥亮、陈跃华、杜思明、熊晓磊、曹汉鸣、陶晓云、王通、方峻、李小凤、曹晓松、蒋晓冬、邱培强、洪妍、李亮辉、高娟妮、曹小震、陈笑.
由于译者才疏学浅,译文中难免会有错漏与偏颇之处,望诸位海涵.
如有关于本书或者XML技术的任何意见或想法,敬请将反馈发送邮件至liuyunpeng275@gmail.
com.
我会认真阅读您发来的每一封邮件.
刘云鹏于北京作者简介JoeFawcett(http://joe.
fawcett.
name)已经断断续续从事软件开发四十年有余.
他是最早荣获Microsoft颁发的最有价值专家荣誉的成员之一.
Joe是位于伦敦的卡普兰金融学院软件开发的负责人,卡普兰金融学院专注于为人们提供商业和会计培训,拥有英国最先进的在线会计学习系统之一.
除本书的前一版外,这是他为Wrox编写的第三本书籍.
LiamR.
E.
Quin(http://www.
holoweb.
net/~liam)在万维网联盟(W3C)负责XML相关工作.
在20世纪80年代初他就已经在从事标记语言和文本方面的工作,并自XML的诞生之日起便从事相关工作.
他拥有计算机科学以及数字排版的背景知识,同时还出于对书籍和插图的热爱,维护着网站www.
fromoldbooks.
org.
他住在加拿大安大略省米尔福德峡湾附近一个古老的农场中.
DannyAyers(http://dannyayers.
com)是一名Web技术——主要是与链接数据相关的技术——的独立研究员与开发者.
他在XML的早期便热衷于该技术.
他的专业背景是电子音乐,尽管自从Web出现以来该兴趣已经退居次要位置.
生活中他是一个木雕业余爱好者,来自英国,现在他在托斯卡纳农村与两只狗和两只猫生活在一起.
技术编辑简介KarenTegtmeyer是一名拥有超过10年经验的独立顾问与软件开发者.
她从事过多种工作,包括设计、开发、培训以及架构.
同时她还是得梅因社区学院的一名兼职计算机科学讲师.
致谢我诚挚地感谢编辑VictoriaSwider以及组稿编辑CarolLong的协助,当本项目看上去停滞不前时是他推进了整个项目.
我想感谢前一版本的作者,特别是JeffRafter和DavidHunter,他们使得我们在必要时能够借鉴他们的工作成果.
还要感谢妻子Gillian以及我的孩子Persephone和Xavier,他们在过去一年中忍受着我的缺席与蹩脚的幽默;我保证会补偿你们的.
—JoeFawcett感谢我的合著者,感谢我的宠物们忍受冗长而又飘忽不定的时间,当然还要感谢AlexanderChalmers创建1810年的传记词典.
—LiamR.
E.
Quin非常感谢Victoria、Carol以及整个团队所做的一切.
同样感谢Joe提供本项目背后的动力,感谢Liam使它能持续进展.
—DannyAyers前言作为一本书的第5版,这足以证明其在专业开发人员和学术机构中的流行程度.
本书致力于传授这样一种知识,它起初看起来只是另一种昙花一现的技术,但是相反却不断发展成熟以致成为一种理所当然的选择.
自本书前一版本算起已将近六年光阴——在IT中这是一个名副其实的生命周期.
在复审第4版中哪些应该保留,哪些应该更新,哪些新材料需要补充的过程中,作者发现大约四分之三的材料已经完全过时.
相较于于五年前XML有了更多用途,同时在它背后也有了更多依赖XML的技术.
现在我们不再需要手工配置深奥的配置文件来让一个Web服务启动并运行.
此外在某些领域人们也发现XML并不是总是最合适的.
这样或那样的情况,伴随着一次对内容的完整翻修,便形成了这一新版本的基础.
因此,什么是XMLXML代表可扩展标记语言(eXtensibleMarkupLanguage),它是一门用于以一种有意义的方式描述数据的语言.
实质上无论哪里都需要存储数据,尤其是在数据可能需要被多个应用处理时,XML便是一个很好的起点.
它已经在那些重视交互性的场景上取得了良好的声誉从而成为候选技术,这些场景既可以是不同企业间的两个应用,也可以是一个公司内的两个应用.
目前存在数百种标准化XML格式,称为架构(schema),它们已经由各个企业达成共识来表示不同类型的数据,从病历到金融交易再到用于表示旅程的GPS坐标.
本书读者对象本书面向广泛的读者群体.
大多数开发者听说过XML但是却对其存有一丝恐惧.
XML如今已经习惯在幕后使用,只有在其不能正常工作或者开发者希望做一些与众不同的事情时,用户才意识到他们必须关注内部原理.
对于这些人我们有一句忠告:不再恐惧.
它同样适用于那些在其他领域拥有丰富经验但是却从没有正式接触过XML的开发者.
最后,当你需要第一次尝试一些新东西时,它可以作为你的参考.
本书中几乎所有技术都有一个相关的"试一试"练习,它将引导你运行一个简单的示例并对该示例的工作过程进行解释.
本书大体上并不需要你有任何标记语言的知识.
这些知识都将在前面几章覆盖.
尽管预计大部分读者都有一些Web编程的知识与经验,但是我们已经试着扩展示例使得这些知识包括使用Microsoft堆栈、Java或者其他诸如PHP或Python的开源框架.
不用在意书名中的"入门"一词,那只是Wrox用于描述本书风格的词汇而不是指你的经验水平.
本文中的许多概念,特别是最后几章,均来自于现实生活,已经远远超出了入门的范畴.
XML入门经典(第5版)VI本书的内容本书旨在教授你需要知道的XML的所有知识——它是什么,它如何工作,它的相关技术,以及如何使用它来进行工作(从简单的数据转换到提供多通道内容).
本书着手回答下面这些基础问题:什么是XML如何使用XML它是如何工作的它能用来做什么XML的基本概念自出现以来一直没有改变过,但是其周边的技术却发生了显著的变化.
本书对每种技术以及它是如何崛起的都做了一个基本的回顾,但是大部分例子使用的都是最新版本的技术.
这些例子同样来自多个平台,其中Java和.
NET占据大多数.
XML产品同样有所涉及,一度曾经有许多免费和商业的可扩展样式表语言转换(XSLT)处理器;例如XSLT用于操纵XML,将其由一种结构转换为另一种,这将在第8章介绍,但是自从版本2出现之后,由于需要开发和维护软件的工作增多,这些处理器数量已经大幅减少.
本书的组织结构我们已经尝试将本书中覆盖到的主题以一种尽可能符合逻辑的方式来编排使你能够从一名初学者蜕变成一名专家.
每一章节都覆盖一个不同的专业领域.
除非你对基础知识相当了解,我们建议你阅读第1部分的介绍性章节,尽管对于精明的读者来说略读就已经足够了.
其他章节可以按照顺序阅读,或者如果你对其中某一领域尤其感兴趣,可以直接跳到那一章阅读.
例如,当你的老板突然告知你下一个版本必须提供一个XQuery插件,你就可以直接跳到第9章.
本书一个简要的概述如下:首先你将学习XML的精确定义以及为什么人们觉得它有用.
之后带你学习如何创建XML以及应该遵循哪些规则.
一旦你掌握了它,你将继续学习一个合法的XML文档是什么样子的,以及你如何确定你的文档是合法的.
之后将了解如何能够操纵XML文档来提取数据并将其转换成其他格式.
接下来将会在数据库中存储XML——介绍这么做的优点与缺点,以及如何对数据库中的数据进行查询.
之后将学习提取数据的其他方法,特别是哪些适用于处理大文档的方法.
然后我们介绍了XML的一些用途,如何以XML格式发布数据,如何创建与使用基于XML的Web服务.
我们解释了AJAX的由来以及它的工作原理,同时还有一些XML的替代品以及何时可以考虑使用它们.
之后是关于如何在网页中以及图片显示中使用XML的一些章节.
最后是一个案例分析.
它将许多基于XML的技术结合应用于一个现实世界中的例子.
前言VII我们已经试着将本书按照一种符合逻辑的方式进行组织,首先向你介绍基础知识,之后带领你学习与XML相关的不同技术.
这些技术被分成六个部分,它覆盖了大部分你能遇到的XML的主题,从原始数据验证到处理、存储以及展现.
第Ⅰ部分:XML介绍大部分读者应该从这里开始.
该部分的各章覆盖了XML的目标以及构建规则.
在阅读了这一部分之后你应该理解基本概念与术语.
如果你已经熟悉XML,你可以快速浏览这些章节.
第1章:什么是XML——第1章介绍了XML的历史,为什么需要它,以及创建XML文档的基本规则.
第2章:良构的XML——该章进一步详细描述了一个文档如果称为XML,则它应该包含什么,不应该包含什么.
它还包括了用于描述一个XML文档中不同组成部分的现代命名系统.
第3章:XML名称空间——每个人的最爱,可怕的名称空间主题以一种简单易懂的方式进行解释.
在阅读完该章之后,你将成为专家,而其他人则还在抓耳挠腮.
第Ⅱ部分:验证本部分涵盖了多种技术来协助你验证创建或接收的XML的格式是否正确.
第4章:文档类型定义——DTD是最初的XML验证机制.
该章展示了如何使用它们来既对文档进行约束又能提供额外内容.
第5章:XMLSchema——XMLSchema是一种更现代的描述一个XML文档格式的方式.
该章描述了它们的工作方式并讨论了DTD的优缺点.
第6章:RELAXNG和Schematron——有时无论是DTD还是Schema都无法提供你需要的功能.
该章介绍了另外两种方法,可用来检查XML是否合法,此外还包含混合了多种验证技术的例子.
第Ⅲ部分:处理该部分包含了从一个XML文档提取数据和将一种XML格式转换为另一种格式的技术.
它包含了XPath基础,它是许多XML技术的基石.
第7章:从XML中提取数据——该章介绍了文档对象模型(DOM),一种最早设计出来用于从XML中提取数据的方式.
之后继续描述了XPath,XML技术的基石之一,它能精确定位到感兴趣的一个或多个项.
第8章:XSLT——XSLT是一种将XML从一种格式转换成另一种格式的方法,如果你是从一个外部源接收文档并且需要自己的系统能够读取该文档,则它是一种基本方法.
它覆盖了版本1的基础,当前版本的更高级特性,并展示了下一个版本中计划中的一些特性.
第Ⅳ部分:数据库在过去的许多年中,数据库中存储的数据与XML中的数据一直存在差距.
本部分内容将两者结合在一起,并向你展示了如何能充分利用两种方式.
XML入门经典(第5版)VIII第9章:XQuery——XQuery是一种被设计成查询已存在文档并创建新XML文档的机制.
它尤其适用于存储在数据库中的XML数据,该章将展示它的工作原理.
第10章:XML与数据库——许多数据库系统现在都有特意为XML设计的功能.
该章检验了三种上述产品,展示了如何同时查询与更新已有数据,并在有需要时创建新的XML.
第Ⅴ部分:程序设计该部分专注于两种处理XML的编程技术.
第11章覆盖了处理大文档的技术,第12章展示了Microsoft最新的通用数据访问策略,LINQ是如何与XML结合使用的.
第11章:事件驱动程序设计——该章介绍了两种特别适用于处理大文件的XML处理方法.
一个是基于开源API的,示例代码使用Java实现.
第二个是Microsoft的.
NET框架的核心部分,它的示例代码使用C#实现.
第12章:LINQtoXML——该章介绍了Microsoft最新处理XML的方法,从创建到查询再到转换.
它包含了许多使用C#和VB.
NET的示例,目前相较于.
NET版本它们具有更多功能.
第Ⅵ部分:通信本部分共有5个章节,它们专注于使用XML作为一种通信方式.
它覆盖了将数据以一种许多不同系统都能够利用的形式来展示,之后说明了Web服务如何能使数据被大量不同的客户端所使用.
最后讨论了如何以一种标准的方式描述复杂数据使得它能够被访问.
第13章:RSS、Aton和内容聚合——本章覆盖了将内容(比如新闻feed)以一种平台独立的方式展示的主要方法.
它还介绍了相同的XML格式如何能用于展示诸如客户列表或销售业绩之类的结构化数据.
第14章:Web服务——Web服务是过去十年中最大的软件成就之一.
该章分析了它们如何工作,XML如何与其结合,如果要排除遇到的问题,这些是必须了解的基础知识.
第15章:SOAP和WSDL——该章深入挖掘Web服务并描述了内在使用的两个主要系统:SOAP(它决定了服务如何被调用),以及Web服务描述语言(WSDL),WSDL用于描述Web服务应该提供什么内容.
第16章:AJAX——该部分的最后一章介绍了AJAX以及它如何能够让你的网站在保持响应并使用更少的带宽的情况下提供即时信息.
很显然,它使用了XML,但是该章还介绍了你希望抛弃XML转而使用一种替代技术的情况.
第Ⅶ部分:显示本部分展示了两种使用XML以一种用户友好的方式显示信息同时其格式又能够被计算机识别的方法.
第17章:XHTML和HTML5——该章介绍了如何以及何时使用XHTML以及为什么它相较于传统的HTML更受欢迎.
之后进一步展示了HTML5的新特性以及它如何消除其中的一些障碍.
第18章:可伸缩矢量图形(SVG)——该章介绍了如何将图片存储在XML格式中以及这种做法的优点.
之后展示了这种格式如何与其他的诸如HTML的格式相结合,以及这样做的原因.
前言IX第Ⅷ部分:案例分析该部分包含了一个案例分析,它结合了XML的许多用途,并以一个真实世界的例子来展示了它们之间是如何交互的.
第19章:案例分析:XML在出版业中的应用——该案例分析展示了一个虚构的出版社如何从一个基于专有的出版软件转移到一个基于XML的工作流,以及在商业上带来了哪些好处.
附录三个附录包含了参考资料以及每章最后练习的答案.
附录A:习题参考答案——该附录包含全书所有出现过的每章最后练习的答案.
附录B:XPath函数——该附录包含大部分XPath函数的信息、它们的签名、返回值以及如何使用它们的例子.
附录C:XMLSchema数据类型——该附录包含由XMLSchema定义的众多内置数据类型的信息.
它展示了这些数据类型之间的联系以及它们如何被不同的面(facet)所限制.
使用本书的预备知识运行本书中的示例并不需要购买任何软件,所有例子都可以使用免费可用的软件来编写并运行.
你将需要一个装有标准浏览器的计算机——InternetExplorer、Firefox、Chrome或Safari,只要它们是较新的版本都可以工作.
如果你想亲自创建实例而不是从Wrox网站下载,那么你将需要一个基本的文本编辑器,即使是记事本也照样可以.
对于一部分代码你也需要运行一个Web服务器,Windows下的IIS服务器的免费版本或者其他系统的众多开源实现服务器(比如Apache)都可以满足需求.
对于一些代码示例,你将需要使用VisualStudio.
你既可以使用Microsoft的商业版本,也可以使用供下载的免费版本.
如果想使用免费版本VisualStudioExpress2010,可以前往www.
microsoft.
com/visualstudio/en-us/products/2010-editions/express下载.
每个版本的VisualStudio都专注于某个特定领域,比如C#或Web开发,因此为了验证所有的示例,你需要下载C#版本,VB.
NET版本以及Web版本.
你还应该安装VisualStudio2010的1.
0服务包,它可以在www.
microsoft.
com/download/en/details.
aspxid=23691下载到.
一旦一切准备就绪你就能够打开样例解决方案,或者如果失败的话,可以通过选择File|Open|Project/Solution.
.
.
的方式打开解决方案中的一个样例项目,并浏览解决方案文件或者你希望运行的特定项目.
在本书即将出版之时,Microsoft正在准备推出新版本VisualStudio2011.
尽管截图可能会略有不同,但是本书中的例子都应该可以在新版本中运行.
约定为了帮助你从本书中获得尽可能多的知识以及清楚地知道它的内容,在本书中我们使用了大量的约定.
XML入门经典(第5版)X试一试"试一试"是一个你应该遵循本书中的文字说明而进行实践的练习.
(1)它们通常由许多步骤组成.
(2)每一步骤都有一个编号.
(3)使用你自己的数据库副本来按照步骤进行练习.
示例说明在每个"试一试"之后,将会详细讲解你所输入的代码.
我们使用如下两种方式表示代码:对于大部分示例我们使用不带突出效果的monofont类型.
对于当前上下文中尤其重要的代码我们使用加粗字体来突出显示.
源代码在读者学习本书中的示例时,可以手动输入所有的代码,也可以使用本书附带的源代码文件.
本书使用的所有源代码都可以从本书合作站点http://www.
wrox.
com或www.
tupwk.
com.
cn/downpage上下载.
登录到站点http://www.
wrox.
com,使用Search工具或书名列表就可以找到本书.
接着单击本书细目页面上的DownloadCode链接,就可以获得所有的源代码.
在下载了代码后,只需要用自己喜欢的解压缩软件对它进行解压缩即可.
另外,也可以进入http://www.
wrox.
com/dynamic/books/download.
aspx上的Wrox代码下载主页,查看本书和其他Wrox图书的所有代码.
警告:像这样带有警告图标的方框非常重要,它是与上下文内容紧密相关的必须牢记的信息.
注意:铅笔图标表示当前讨论的注释、提示、暗示、技巧以及旁白.
注释:由于许多图书的标题都很类似,因此按ISBN搜索是最简单的,本书英文版的ISBN是978-1-118-16213-2.
前言XI勘误表尽管我们已经尽了各种努力来保证文章或代码中不出现错误,但是错误总是难免的,如果您在本书中找到了错误,例如拼写错误或代码错误,请告诉我们,我们将非常感激.
通过勘误表,可以让其他读者避免受挫.
当然,这还有助于提供更高质量的信息.
请给wkservice@vip.
163.
com发电子邮件,我们就会检查您的信息,如果是正确的,我们将在本书的后续版本中采用.
要在网站上找到本书的勘误表,可以登录http://www.
wrox.
com,通过Search工具或书名列表查找本书,然后在本书的细目页面上,单击BookErrata链接.
在这个页面上可以查看到Wrox编辑已提交和粘贴的所有勘误项.
完整的图书列表还包括每本书的勘误表,网址是www.
wrox.
com/misc-pages/booklist.
shtml.
P2P.
WROX.
COM要与作者和同行讨论,请加入p2p.
wrox.
com上的P2P论坛.
这个论坛是一个基于Web的系统,便于您张贴与Wrox图书相关的消息和相关技术,与其他读者和技术用户交流心得.
该论坛提供了订阅功能,当论坛上有新的消息时,它可以给您传送感兴趣的话题.
Wrox作者、编辑和其他业界专家和读者都会到这个论坛上来探讨问题.
在http://p2p.
wrox.
com上,有许多不同的论坛,它们不仅有助于阅读本书,还有助于开发自己的应用程序.
要加入论坛,可以遵循下面的步骤:(1)进入p2p.
wrox.
com,单击Register链接.
(2)阅读使用协议,并单击Agree.
(3)填写加入该论坛所需要的信息和自己希望提供的其他信息,单击Submit.
(4)您会收到一封电子邮件,其中的信息描述了如何验证账户,完成加入过程.
加入论坛后,就可以张贴新消息,响应其他用户张贴的消息.
可以随时在Web上阅读消息.
如果要让该网站给自己发送特定论坛中的消息,可以单击论坛列表中该论坛名旁边的SubscribetothisForum图标.
关于使用WroxP2P的更多信息,可阅读P2PFAQ,了解论坛软件的工作情况以及P2P和Wrox图书的许多常见问题.
要阅读FAQ,可以在任意P2P页面上单击FAQ链接.
不加入P2P也可以阅读论坛上的消息,但要张贴自己的消息,就必须加入该论坛.
目录第Ⅰ部分XML介绍第1章什么是XML.
31.
1初识XML:数据描述和标记语言31.
1.
1二进制文件.
41.
1.
2文本文件.
41.
1.
3标记语言简史51.
2XML的诞生51.
3XML的优点81.
3.
1XML规则81.
3.
2数据的分层表示形式.
91.
3.
3通用性101.
4XML的实际应用.
111.
4.
1数据和文档.
111.
4.
2XML场景121.
4.
3XML技术131.
5小结19第2章良构的XML.
212.
1良构的定义212.
2在文本编辑器中创建XML.
222.
2.
1禁止的字符.
222.
2.
2XML序言222.
2.
3创建元素.
242.
2.
4属性272.
2.
5元素与属性内容282.
2.
6处理指令.
322.
2.
7CDATA节322.
3高级XML解析342.
3.
1XMl等价性342.
3.
2空白处理.
352.
3.
3错误处理.
362.
4XML信息集.
392.
4.
1文档信息项.
392.
4.
2元素信息项.
392.
4.
3属性信息项.
402.
4.
4处理指令信息项402.
4.
5字符信息项.
402.
4.
6注释信息项.
402.
4.
7名称空间信息项402.
4.
8文档类型声明信息项402.
4.
9未扩展实体引用信息项.
412.
4.
10未解析实体信息项.
412.
4.
11符号信息项412.
5小结.
41第3章XML名称空间.
433.
1名称空间的定义.
433.
2需要名称空间的原因.
443.
3选择名称空间的方法.
453.
3.
1URL、URI和URN.
463.
3.
2创建第一个名称空间463.
4声明名称空间的方法.
473.
4.
1名称空间的作用域503.
4.
2声明多个名称空间503.
4.
3修改名称空间定义523.
5名称空间的实际应用.
553.
5.
1XMLSchema.
553.
5.
2多名称空间文档553.
6使用名称空间的时机.
593.
6.
1何时需要使用名称空间.
593.
6.
2何时不需要使用名称空间.
603.
6.
3版本控制和名称空间603.
7常见的名称空间.
61XML入门经典(第5版)XIV3.
7.
1XML名称空间.
613.
7.
2XMLNS名称空间.
623.
7.
3XMLSchema名称空间.
623.
7.
4XSLT名称空间.
623.
7.
5SOAP名称空间.
633.
7.
6WSDL名称空间.
633.
7.
7Atom名称空间.
633.
7.
8MathML名称空间633.
7.
9Docbook名称空间643.
8小结64第Ⅱ部分验证第4章文档类型定义.
694.
1文档类型定义的概念694.
1.
1使用DTD.
704.
1.
2使用jEdit704.
1.
3详述DTD.
734.
1.
4DTD共享.
764.
2DTD剖析774.
2.
1元素声明.
774.
2.
2属性声明.
854.
2.
3实体声明.
904.
3DTD的局限性944.
4小结94第5章XMLSchema.
975.
1XMLSchema的优点.
985.
1.
1XMLSchema使用XML语法.
.
.
.
.
.
.
.
985.
1.
2XMLSchema支持名称空间.
.
.
.
.
.
.
.
985.
1.
3XMLSchema的数据类型.
985.
1.
4XMLSchema的内容模型.
995.
1.
5XMLSchema规范995.
2XMLSchema实践.
995.
3XMLSchema的定义.
1035.
3.
1声明1035.
3.
2声明1075.
3.
3混合内容.
1155.
3.
4声明1155.
3.
5声明1175.
3.
6通讯录的XMLSchema1175.
3.
7数据类型1235.
3.
8声明.
1295.
4创建一个来自多个文档的架构.
1335.
4.
1声明1345.
4.
2声明1375.
5XMLSchema的开发文档1395.
6XMLSchema1.
11415.
6.
1宽松的规则.
1415.
6.
21425.
7小结.
143第6章RELAXNG与Schematron.
.
.
.
.
.
.
1456.
1为什么需要更多的XML验证方法.
1466.
2设置环境.
1466.
3使用RELAXNG.
1476.
3.
1理解RELAXNG基础1476.
3.
2理解RELAXNG紧凑语法.
1526.
3.
3两种RELAXNG格式的转换.
.
.
.
1546.
3.
4约束内容1556.
3.
5在RELAXNG架构中复用代码1576.
4使用Schematron.
1616.
4.
1理解Schematron基础.
1616.
4.
2选择Schematron版本.
1626.
4.
3理解基本过程.
1626.
4.
4编写Schematron基本规则1626.
4.
5创建Schematron文档.
1646.
4.
6向消息添加更多信息1656.
4.
7Schematron约束取值.
1676.
4.
8Schematron处理协约束.
1696.
4.
9在XMLSchema中使用Schematron.
1706.
5小结.
173目录XV第Ⅲ部分处理第7章从XML中提取数据1777.
1文档模型:XML的内存表示.
.
.
.
.
1777.
1.
1初识模型:DOM、XDM与PSVI1777.
1.
2一个样例DOM树1787.
1.
3DOM节点类型1797.
1.
4DOM节点列表1807.
1.
5DOM的限制.
1807.
2XPath语言1817.
2.
1XPath基础1817.
2.
2XPath谓词:完整的故事1837.
2.
3XPath步与轴1857.
2.
4XPath表达式1867.
2.
5XPath表达式中的变量1897.
2.
6XPath2中的新表达式1907.
2.
7XPath函数1947.
2.
8XPath集合运算.
1967.
2.
9XPath与名称空间.
1967.
3小结198第8章XSLT.
1998.
1XSLT的用途.
2008.
1.
1XSLT作为声明性语言2008.
1.
2XSLT作为功能性语言2018.
2建立XSLT开发环境.
2028.
2.
1设置.
NET版本的SAXON环境.
.
.
.
2028.
2.
2设置Java版本的Saxon环境.
.
.
.
.
.
.
.
2038.
3基本的XSLT元素.
2048.
3.
1元素2058.
3.
2元素2068.
3.
3元素.
2098.
3.
4元素2098.
3.
5元素2118.
3.
6推处理与拉处理2118.
3.
7XPath在XSLT中的作用.
2118.
3.
8使用命名模板2138.
3.
9元素2168.
3.
10XSLT中document()函数.
2178.
3.
11条件逻辑2228.
3.
12元素.
2268.
3.
13元素.
2278.
3.
14与元素2298.
4在XSLT中复用代码.
2318.
4.
1元素.
2318.
4.
2元素.
2348.
4.
3Mode属性.
2348.
5理解内置模板与内置规则.
2378.
6使用XSLT2.
0.
2388.
6.
1理解XSLT2.
0中的数据类型.
.
.
.
2398.
6.
2创建自定义函数2398.
6.
3创建多个输出文档2438.
6.
4使用collection()函数2448.
6.
5XSLT2.
0分组.
2458.
6.
6XSLT2.
0处理非XML输入.
.
.
.
.
.
2488.
7XSLT与XPATH3.
0:未来展望.
2538.
8小结.
254第Ⅳ部分数据库第9章XQuery2579.
1XQuery、XPath和XSLT2579.
1.
1XQuery和XSLT2589.
1.
2XQuery和XPath2589.
2XQuery实践.
2599.
2.
1独立XQuery应用.
2599.
2.
2SQL语句2599.
2.
3Java或其他编程语言调用2599.
2.
4原生XML服务2599.
2.
5无处不在的XQuery.
2599.
3XQuery基础模块.
2629.
3.
1FLWOR表达式、模块以及函数2629.
3.
2无默认上下文项的XQuery表达式.
2669.
4查询表达式详解.
2669.
4.
1版本声明267XML入门经典(第5版)XVI9.
4.
2序体2679.
4.
3查询体2729.
5一些可选的XQuery特性.
2789.
5.
1XQuery和XPath全文索引2789.
5.
2XQuery更新功能.
2799.
5.
3XQuery脚本扩展.
2799.
6即将到来的XQuery3.
0.
2799.
6.
1group和window.
2809.
6.
2count子句2819.
6.
3try和catch2819.
6.
4switch表达式.
2829.
6.
5函数项和高阶函数2839.
6.
6JSON特性.
2849.
6.
7XQuery、关联数据和语义网.
.
.
.
.
2849.
7小结284第10章XML与数据库28710.
1了解数据库为什么需要能处理XML.
28710.
2分析数据库所需的XML功能28810.
2.
1检索文档28910.
2.
2在文档中检索数据.
28910.
2.
3更新XML文档28910.
2.
4以XML形式展示关系型数据28910.
2.
5以关系型数据的形式显示XML数据.
29010.
3XML与MySQL数据库29010.
3.
1安装MySQL29010.
3.
2在MySQL中添加信息.
29110.
3.
3MySQL查询命令.
29310.
3.
4用MySQL更新XML数据.
.
.
.
.
.
.
29710.
3.
5在MySQL中使用XML.
29810.
3.
6MySQL客户端对XML的支持.
29810.
4XML与SQLServer数据库.
.
.
.
.
.
.
.
29910.
4.
1安装SQLServer.
29910.
4.
2用XML显示关系型数据.
.
.
.
.
.
.
30010.
4.
3了解XML数据类型31310.
4.
4为xml数据类型创建索引.
.
.
.
.
.
31610.
4.
5SQLServer的W3CXMLSchema32310.
4.
6处理带名称空间的文档.
.
.
.
.
.
.
32410.
5XML与exist数据库32510.
5.
1下载并安装eXist.
32510.
5.
2交互操作eXist.
32710.
6小结.
335第Ⅴ部分程序设计第11章事件驱动程序设计.
33911.
1理解顺序处理.
33911.
2在顺序处理中使用SAX.
34011.
2.
1准备工作.
34111.
2.
2接收SAX事件34111.
2.
3处理无效内容35211.
2.
4DTDHandler接口36111.
2.
5EntityResolver接口.
36111.
2.
6了解特性与属性36211.
3XMLREADER.
36611.
3.
1XmlReaderSettings37211.
3.
2管理外部资源37611.
4小结.
377第12章LINQtoXML37912.
1LINQ的概念.
37912.
1.
1需要LINQtoXML的原因.
.
.
.
.
38112.
1.
2使用LINQtoXML38212.
2创建XML文档.
38412.
2.
1创建带名称空间的文档.
.
.
.
.
.
.
38612.
2.
2创建带有前缀名的名称空间的文档.
38712.
3从XML文档中提取数据.
38712.
4修改文档.
39412.
4.
1添加内容.
39412.
4.
2删除文档中的内容.
39512.
4.
3更新和替换文档中的内容.
.
.
.
39612.
5转换文档.
397目录XVII12.
6VB.
NET的XML属性39912.
6.
1VB.
NET的XML文本39912.
6.
2VB.
NET的坐标轴属性.
40212.
6.
3在VB.
NET中管理名称空间.
.
.
.
40412.
7小结404第Ⅵ部分通信第13章RSS、Atom和内容聚合.
40913.
1聚合40913.
1.
1XML聚合.
41013.
1.
2聚合系统41213.
1.
3格式剖析41413.
2使用新闻feed.
42213.
2.
1新闻阅读器42313.
2.
2数据质量42313.
3一个简单的聚合器42313.
3.
1feed模型42413.
3.
2程序流程42613.
3.
3实现程序42613.
3.
4用XSLT转换RSS格式.
44313.
4几个有用的网站地址45213.
5小结453第14章Web服务45514.
1什么是远程过程调用45514.
2RPC协议.
45614.
2.
1DCOM.
45714.
2.
2CORBA与IIOP.
45814.
2.
3JavaRMI.
45814.
3新的RPC协议——Web服务.
.
.
.
.
45914.
3.
1同源策略46014.
3.
2理解XML-RPC.
46114.
3.
2选择网络传输46314.
4理解REST服务.
47314.
5Web服务的堆栈技术47714.
5.
1SOAP.
47714.
5.
2WSDL47814.
5.
3UDDI47914.
5.
4相关规范47914.
6小结.
481第15章SOAP和WSDL.
48315.
1SOAP基础48315.
2RPC新协议——SOAP.
48415.
2.
1SOAP与REST对比.
48815.
2.
2基本的SOAP消息48815.
2.
3比较复杂的SOAP交互.
49615.
3定义Web服务语言——WSDL.
50815.
4.
150915.
4.
250915.
4.
350915.
4.
451015.
4.
551015.
4.
651215.
4.
751315.
4.
8其他绑定方式51615.
4小结.
519第16章AJAX.
52116.
1AJAX概述52116.
1.
1AJAX提供反馈52116.
1.
2使用AJAX加载未完成数据.
.
.
52216.
1.
3AJAX执行异步操作52216.
2JavaScript简介.
52316.
2.
1Web浏览器控制台52316.
2.
2值、表达式与变量.
52416.
2.
3控制流语句52616.
2.
4Properties、Objects、Functions与Classes.
52716.
3XMLHttpRequest函数.
52816.
4使用HTTP方法与AJAX53216.
5可达性考虑.
53316.
6jQuery库53416.
6.
1学习jQuery53516.
6.
2领域专用语言(DSL)方法.
.
.
.
.
.
53516.
6.
3jQuery插件和附加库53516.
7JSON与AJAX.
53816.
7.
1JSON示例538XML入门经典(第5版)XVIII16.
7.
2JSON语法53916.
7.
3JSON与jQuery54016.
7.
4JSONP与CORS54016.
8Web服务器后端54016.
8.
1发送图像以及其他非文本数据54116.
8.
2性能.
54116.
8.
3服务器日志是朋友.
54116.
9一个更复杂的例子54216.
10小结546第Ⅶ部分显示第17章XHTML和HTML5.
55117.
1SGML的背景55217.
1.
1HTML和SGML55217.
1.
2XML和SGML55217.
2开放式Web平台55317.
3XHTML简介55417.
3.
1XHTML的元素.
55417.
3.
2XHTML的元素.
55517.
3.
3XHTML的元素55717.
3.
4更多有关高级HTML的主题.
56717.
4XHTML和HTML:问题以及解决方法56817.
5级联样式表(CASCADINGSTYLESHEETS,CSS)56917.
5.
1CSS等级和版本56917.
5.
2CSS一览57017.
5.
3CSS选择器.
57217.
5.
4CSS属性57417.
5.
5CSS特殊规则.
57817.
5.
6CSS和XML57917.
5.
7分离样式和标记:低调的CSS57917.
6UnobtrusiveJavaScript技术.
.
.
.
.
.
58017.
7HTML558017.
7.
1HTML5的优点58017.
7.
2HTML5的注意事项.
58117.
7.
3HTML5中的新元素58117.
8小结.
582第18章可伸缩矢量图形.
58518.
1可伸缩矢量图形和位图.
58518.
1.
1过程式图形58518.
1.
2声明式图形58618.
1.
3位图图像.
58618.
1.
4矢量图像.
58818.
1.
5SVG图像.
58818.
2SVG图像模型.
58918.
3SVG和CSS59118.
4SVG工具.
59218.
5SVG基本内置图形.
59418.
5.
1矩形59518.
5.
2圆形59618.
5.
3椭圆形.
59618.
5.
4直线59718.
5.
5折线和多边形59718.
5.
6SVG路径(SVGPath)59818.
6SVG转换和聚合.
60118.
6.
1转换60118.
6.
2聚合60218.
7SVG定义和元数据.
60218.
7.
1SVG的元素和元素.
60218.
7.
2SVG的元素60318.
7.
3SVG的元素以及可重用内容.
60418.
8视窗和坐标.
60418.
9SVG颜色和梯度.
60518.
10在SVG中使用位图图像.
60718.
11SVG文本和字体.
60818.
12实现SVG动画的4种方法.
.
.
.
.
60918.
12.
1同步多媒体集成语言(SMIL)60918.
12.
2脚本动画61018.
12.
3CSS动画.
61118.
12.
4外部库文件.
611目录XIX18.
13SVG和HTML561118.
14SVG和Web应用61318.
15使用XQUERY或XSLT生成SVG图像61318.
16资源61418.
17小结614第Ⅷ部分案例分析第19章案例分析:XML在出版业中的应用61719.
1背景61719.
2产品介绍:目前的工作流程.
.
.
.
61819.
3引入一个全新的基于Web的工作流程61819.
3.
1协商.
61819.
3.
2编写项目文档61919.
3.
3原型设计61919.
4创建新流程61919.
4.
1富有挑战性的条件.
61919.
4.
2新的工作流62019.
4.
3记录转变过程和用到的技术.
62019.
4.
4成本收益分析62119.
4.
5部署62119.
5一些技术要点.
62219.
5.
1XQuery和模块62219.
5.
2XInclude62219.
5.
3方程和MathML62319.
5.
4XProc:一种XML管道语言62519.
5.
5XForms、REST和XQuery.
.
.
.
62619.
5.
6使用XSL-FO将对象格式化为PDF.
62619.
5.
7文档类XML标签62819.
5.
8人文科学类标签:TEI.
62919.
6HoyBooks的网站.
62919.
7小结.
633附录A习题参考答案635附录BXPath函数655附录CXMLSchema数据类型.
673第Ⅰ部分XML介绍第1章什么是XML第2章良构的XML第3章XML名称空间什么是XML本章内容:XML出现之前的历史XML的诞生XML文档的基本格式XML的应用领域XML相关技术的简介XML是可扩展标记语言(ExtensibleMarkupLanguage)的缩写(大概是原作者认为XML比EML听起来更加令人兴奋).
在软件和IT领域,XML的发展和流行遵循一种常规的模式.
XML出现于十多年前,起初使用它的应用程序廖廖无几,不过后来它就引起了公众广泛关注,它的使用开始遍及数据交换领域.
随后,XML的处理和管理工具不断完善,许多人在不知道XML存在的情况下就已经在使用它.
近来人们对它的一些缺陷与缺点有了反应,不过也随之产生了许多改进以及替代措施.
如今XML在IT领域已经拥有无可动摇的地位,很难想象有一个重要的应用程序不使用XML来保存它的配置文件或数据文件.
出于以上原因,有必要让现代程序开发人员透彻地了解XML的原理,XML能胜任的场景以及如何利用XML的最大优势.
而这本书正好可以提供这些内容.
1.
1初识XML:数据描述和标记语言XML主要有两种应用:第一种是用XML来表述底层数据,如配置文件.
第二种是利用XML1第章注意:虽然本章提供了一些简短的XML例子,但是并不要求你现在就能理解它们的含义.
我们的想法只是向你介绍语言背后的重要概念,这样,在你看完全书后,不仅能够掌握XML的用法,而且知道它的处理过程.
第Ⅰ部分XML介绍4为文档添加元数据.
例如,在一份报告中用斜体字或粗体字强调一个特殊的句子.
上面提到的第一种XML的用法是用它来替代传统数据表示方式(如Windows系统上INI文件或Java的Property文件中的名称/值的表示方式).
第二种XML的应用类似于HTML文件的工作方式.
文档内容包含在元素代表的整体容器内,以或标签使这部分内容以斜体或粗体显示以表示强调.
针对这两类应用场景,多年来涌现了多种技术.
随着互联网的普及和分布式应用的广泛使用,尤其在软件的不同组件由不同的团队负责开发时,这些不同技术间的差异所造成的问题日益凸显.
这个问题体现在数据的通用性上.
一个分布式系统很可能包含这样两个组件,其中一个使用Windows系统的INI文件输出数据,而另一个组件需要将这些数据转换为JavaProperties格式.
这给两个组件的开发人员都增加了不必要的负担,占用了原本应该用于开发新业务功能的资源.
XML则可以用于解决这类问题,它的目的是使不同组件间的数据交互更容易,降低转换输入输出数据格式时的资源需求,使开发人员能专注于其他更重要的编码工作,如编写代码实现业务逻辑.
XML也常用于解决文件可读性问题,使文件既方便被人们阅读又能被软件解析.
本书也会剖析基于文档的XML和基于数据的XML之间的区别,不过在这之前,让我们先稍微深入地了解一下,在XML出现前计算机是用什么方式存储和交互数据的.
本节内容着眼于数据的一般表述方式,并不会花太多时间解释底层数据(如内存地址等)的详细信息.
这里将文件格式分为两大类:二进制文件和文本文件.
1.
1.
1二进制文件简单来说,二进制文件就是一个比特流(0和1的序列).
只有创建二进制文件的应用程序才会理解整个比特流的含义.
这就是为什么二进制文件只能由某些特定的计算机程序读取和生成的原因,这些程序就是专门为理解这些二进制文件而设计的.
例如,使用MicrosoftWord2003之前的版本保存了一份文档,这个文件(以doc为扩展名)就是以二进制格式创建的.
如果你试图使用文本编辑器(如Notepad)打开这个文件,会发现无法看到之前在Word文档内保存的图片.
最好的情况下你能偶尔看到一些被乱码环绕的文本行,但肯定不是原来保存的,有着使用粗体或斜体样式的散文.
文档中不仅保存了简单的文本,还保存了我们称之为元数据(metadata)的内容,或者称之为关于信息的信息.
混合数据和元数据在二进制文件中非常的常见且简单.
元数据能指定各种文件样式,例如以粗体显示文字,在表格中显示文字等.
你需要创建这个二进制文件的应用程序把它翻译成你能读懂的文字.
离开了这样一个能完全理解二进制格式数据的转换器,即使用WordPerfect这样的具有类似功能的软件,也无法打开一个用Word创建的文档.
二进制格式的主要优点在于内容简洁并且可以被压缩保存到一个相对较小的空间内.
这样可以保存更多的文件(例如保存在硬盘上),更重要的一点是通过网络传输它们时所占用的带宽更小.
1.
1.
2文本文件文本文件和二进制文件相比,最大的不同之处是文本文件是人机均可读的.
不需要一个专门的应用程序去解读它,文本文件中的每一组比特流均表示一个已知字符集中的一个字符.
这意味着许多不同应用程序都能解读文本文件.
在一台标准Windows平台的计算机上,可使用Notepad、WordPad或者其他任何基于命令行的工具,如Edit来解读文本文件.
在非Window平台的计算机上也有各种类似的系统内的嵌程序可以解读文本文件,如Emacs和Vim.
第1章什么是XML5文本文件的优点不仅是人机均可读,而且它们也比二进制文件更容易被解析.
而文本文件的主要缺点是文件较大.
为了使文本文件包含元数据(例如,一段长文本被标记为"重要"),通常会使用一些其他符号将这些文本标记出来.
在HTML文件中很容易看到这样的例子,它使用一对尖括号内的信息来表示文本的处理方式.
例如我希望在HTML页面中标识一个重要语句,那么相应的HTML代码为:returnsmustincludetheitemordernumber另外,文本文件的另一个缺点是缺乏元数据支持.
如果将一个包含有几种字体风格的Word文档保存为一个文本文件,那我们只能得到一个毫无格式的副本,所有的元数据都丢失了.
人们希望找到一种两全其美的方法——一种既方便人类阅读又能被各种应用程序解析,还可以保存元数据的文件格式.
于是标记语言应运而生了.
1.
1.
3标记语言简史文本文件的优点使人们在二进制文件和文本文件中更倾向于使用文本文件,但文本文件的缺点也使人们希望能有一套添加元数据的标准规范让大家遵循.
大多数人认同使用一些额外的文本来记录元数据信息的标记语言,并把它作为技术发展的方向,但仍然有许多事情有待决定.
其中最主要的两个问题是:如何把元数据和原文区分开来文件中允许添加什么样的元数据例如,一些文档需要把内容标记为粗体或斜体,而另一些文档更关心文档的原作者是谁,它是在什么时侯创建的,谁曾经修改过它.
为了解决这些问题,标准通用标记语言(StandardGeneralizedMarkupLanguage,SGML)出现了.
SGML是标记语言历史上的一个里程碑,就像超文本标记语言的历史地位(HyperTextMarkupLanguage,HTML)一样.
和使用标准限制标记语言正相反,SGML允许人们使用标准的语法语义创建他们自己的标记语言.
任何基于SGML语言的应用程序都可以使用这种语言编写的文件并进行相应的处理.
正如之前提到的,最常见的例子就是HTML.
HTML使用尖括号()来区分原文和元数据,HTML还定义了一系列可以用在尖括号内的代码,如em表示文本,tr表示表格,td表示表格内的数据.
1.
2XML的诞生虽然SGML是一种经过深思熟虑的可应用于各种不同场景的标记语言,但它还是遭受了重大失败,因为它太复杂了.
它所有的灵活性都是有代价的,而且只有很少的应用程序可以读取以SGML注意:使用底层数据流表示字符的方式被称为文件的编码方式.
一个文件具体使用何种编码方式可从文件的前几个字节中得知.
应用程序会在打开这个文件时检查这几个字节,并通过它们来确定显示和操作数据的方式.
如果文件的前几个字节为空,则采用应用程序预先设定好的默认字符集来解读文件.
XML使用另一种方法指定文件的编码方式,这将在后面的章节中学习.
第Ⅰ部分XML介绍6方式定义的标记语言并用它来正确地处理文档.
SGML的理念是正确的,但需要被简化.
以此为目标,在20世纪90年代中期一个小开发团队和大量的对此感兴趣的组织开始致力于研究SGML的一个子集,这个子集被称为可扩展标记语言(eXtensibleMarkupLanguage,XML).
XML的第一个草案发布于1996年,两年后的1998年2月10日,W3C发布了它的修订版推荐标准.
XML来源于SGML的一个子集,而HTML是基于SGML的一个应用程序.
XML并没有规定一个文件的整体格式,也没有规定可以添加的元数据,它仅指定了一些规则.
这意味着XML保留了SGML的灵活性,去掉了SGML的复杂性.
例如,有一个标准的文本文件,其中包含了应用程序的用户列表:JoeFawcettDannyAyersCatherineMiddleton这个文件并不包含元数据;你知道这是用户列表.
这些人名在XML文件中表述的方式为:虽然应用程序只通过这个文件依然无法知道如何去处理user,也不知道firstName表示什么,但与原来的文本文件相比,XML文件更能直观地表达这些数据的含义.
比起毫无格式的文本数据,应用程序更容易读取使用XML格式的数据,并对这些数据进行正确处理.
几乎所有XML文件都是由两种内容组成的,它们被称为元素和属性.
在之前的例子里,元素是applicationUsers和user,而属性指的是firstName和lastName.
不过这种记录元数据的方式也有缺点,那就是会增加文件大小.
原文件中只有43个字符,但为了保存元数据,增加了近130个字符,加入元数据后文件比原来大了3倍多.
XML的开发者相信,XML的优势会弥补这一劣势,而事实上XML开发者们的一个箴言正是"使文件变简洁并不是我们的目标",而这一决定后来让无数人追悔莫及.
注意:万维网联盟(TheWorldWideWebConsortium,W3C)是主要的国际万维网标准制定组织,它拥有大量的工作组并致力于为各种在Web上使用的技术制定推荐标准.
一个推荐标准需要经过多个阶段的修改,如工作草案,候选推荐标准最后才能成为推荐标准.
这个过程可能需要耗费数年时间.
而最终协议被称为推荐标准而不是被称为标准的原因是,你依旧可以使用你自己的方法,并不强制使用它.
所有Web开发人员都知道在开发应用程序时,有一些问题在所有的浏览器上都普遍存在,而许多这类问题出现的原因在于浏览器厂商没有遵循W3C的推荐标准,或者浏览器的某些特性在W3C推荐标准定稿前无法开发.
本书涉及的大部分XML技术都有与之相对应的W3C推荐标准,但也有一些仍处于草案阶段.
此外有一些与XML相关的标准源自W3C以外的其他标准组织,这些标准也没有正式的W3C推荐标准,如第11章中讨论的SAX.
第1章什么是XML7通过下面的习题,你会了解应用程序在处理简单的文本文件和XML文件上的不同点.
在这个练习中,浏览器事先并没有缓存这两个文件,你会发现比起文本文件,浏览器能从XML文件中获得更多的元数据.
试一试使用浏览器打开一个XML文件这个例子展示了应用程序在处理XML文件和纯文本文件上的差异.
(1)使用记事本或者文本编辑器创建一个文本文件,文本文件的内容是上面提到的不包含元数据的用户列表.
(2)将这个文件保存为appUsers.
txt.
(3)打开一个浏览器窗口,在地址栏输入appUsers.
txt的文件路径.
可以看到类似图1-1中展现的内容,它只是一个简单的列表.
图1-1(4)创建一个XML格式的文本文件,并把它保存为appUsers.
xml.
如果使用记事本来创建这个文件,在保存时请务必用引号把整个文件名括起来请确保这个文件不会以.
txt为扩展名.
(5)使用浏览器打开这个文件后,你将会看到类似图1-2中展示的内容.
图1-2注意:在本书随后的章节中,你会学习到多种优化XML文大小的方法.
但这些方法都在一定程度上牺牲了文件的可读性和易用性.
警告:如果使用IE浏览器来运行本书中的脚本,可能需要单击浏览器菜单栏上的"工具|Internet选项",并选择"高级"选项卡.
在"安全"项中勾选"允许活动内容在我的计算机上的文件中运行"来允许执行本地脚本.
第Ⅰ部分XML介绍8正如上面所看到的,应用程序处理XML文件的方式和纯文本文件不同.
浏览器用不同的颜色标识出了元数据,而且applicationUsers这个标签可以被收缩或展开.
即使浏览器不知道这个文件里保存了三个不同的应用程序用户,它也能知道这个文件中有一部分数据要以与其他数据不同的方式来处理,并以一种简单易懂的方式将数据分级显示出来.
示例说明浏览器通过XML样式表文件或XML样式转换插件来处理XML文件.
XML样式表文件是一种基于文本的XML格式的文件,通过它可以转换数据的格式.
常应用于将XML格式的数据转换为HTML格式或其他格式的数据场景中,也能通过它将XML格式的数据转换为纯文本文件.
在上面的习题中,浏览器把XML格式的数据转换为HTML格式,以不同的颜色显示标签,而且标签还可以折叠.
样式转换插件的内容将会在第8章"XSLT"中讨论.
1.
3XML的优点XML的目标之一是把数据和它的显示方式完全分离开来.
同样的数据可用不同的方式显示出来.
当通过互联网等方式传输数据时,带宽不会被浪费在传输数据的样式信息上.
XML也不像HTML那样内嵌有数据的显示方式,它分离数据和显示方式的方法相当简单,这也是XML的主要优点之一.
1.
3.
1XML规则为了保证显示方式和数据完全分离,XML有着一套非常严格的规则,不过这对于用户来说也有好处.
例如,在appUsers.
xml文件中你可以看到用户的姓和名都被双引号括起来了.
这是XML文件的必要条件,下面的内容就不是XML数据:注意:如果你希望看到火狐浏览器使用的默认样式表,可以在火狐浏览器的地址栏中输入chrome://global/content/xml/XMLPrettyPrint.
xsl.
IE浏览器也有类似的内嵌的样式表,但无法通过类似方式查看.
IE浏览器的内嵌样式表是Microsoft在相关标准出台前编写的XSLT版本样式表,且早已过时.
注意:在本章中你会多次利用浏览器来查看XML文件.
因为这种方法有许多优点——方便,当XML文件编写错误时能获得合理的提示,而且如今的计算机一般来说都安装有浏览器.
但浏览器并不适合在正式开发XML时使用,尤其不适合在下一个"试一试"那样的场景中使用.
因为大部分浏览器都可以显示编写风格较差的HTML文件,而这种情况下你很难发现其中编写错误的地方,也无法进行调试.
所以我们建议你在开发时使用专用的XML编辑器.
第2章中会介绍一些XML编辑器.
第1章什么是XML9使用引号也很容易发现数据缺失的情况,例如:所有的用户名都缺失了.
因为所有数据都在双引号中,所以这是一组合法的XML数据,应用程序很容易发现并处理这种情况.
不合法的文件输入在影响应用程序正常工作前就能被拒绝.
验证XML文件有效性的方法会在本书第Ⅱ部分中介绍.
使用XML文件的另一个好处是,在向文件中添加新数据时,它很容易被扩展.
例如应用程序的用户数据需要包含中间名,那么你可以通过增加一个名为middleName的属性的方式来达到这个目的:设想有这样一个应用程序,它读取的数据文件中只包含姓和名这两个字段,并将这些数据输出到屏幕的列表上.
最初这个软件就是被设计成只显示用户的姓和名的,现在新的需求要求一部分应用程序也能显示用户的中间名.
新版本的应用程序使用的XML文件只要增加一个名为middleName的属性就能满足这个要求.
旧版本的应用程序也依然还可以使用这个XML文件,它只是忽略了新版本应用程序需要的中间名字段.
如果使用纯文本文件来保存用户数据,就很难满足这种需求.
如appUsers.
txt:JoeJohnFawcettDannyJohnAyersCatherineElizabethMiddleton由于无法通过分隔符来界定数据的起止位置,旧版本的应用程序很可能会错误地解读文本文件中的第二列数据,即使中间名被放置到第三列上,也很可能使应用程序在解析文件时出现问题.
而XML格式的数据很容易区分用户名的不同部分.
1.
3.
2数据的分层表示形式XML格式的数据和纯文本文件相比另一个好处在于分层显示数据.
假设有这样一个场景:在文件系统中,根目录内有许多文件和文件夹,而每一个文件夹内又包含子目录和文件,而子目录内还可能包含子目录和文件.
如果使用文本文件来记录就可能是这样的一种形式:文件内容包含两列,一列表示文件路径,另一列说明这是一个文件还是一个子目录.
PathTypeC:\folderC:\pagefile.
sysfile第Ⅰ部分XML介绍10C:\ProgramFilesfolderC:\ProgramFiles\desktop.
inifileC:\ProgramFiles\MicrosoftfolderC:\ProgramFiles\MozillafolderC:\WindowsfolderC:\Windows\System32folderC:\TempfolderC:\Temp\~123.
tmpfileC:\Temp\~345.
tmpfile文件的内容既不优美也不方便阅读.
编写这一段文档时也无法方便地将各列对齐.
再来看看XML文件是如何表示这些信息的:这种分层显示的方式更易于阅读,冗余数据更少,更易于解析.
1.
3.
3通用性XML的主要优点在于它的通用性.
在不同的应用程序间传递数据时,使用XML格式的数据能很容易达成格式上的共识,因为XML文件本身包含了元数据,应用程序不需要对数据格式再做加工处理.
由于可以读取并解析XML文件的解析器性价比很高,任何人都可以按他们的要求生成应用程序能够处理的XML文件,同时这些文件也能被其他应用程序解读或重建.
通用性的重要性可以参见本章开头描述二进制文件时所举的例子.
在MicrosoftWord2003以前,Word生成的文件都是二进制格式的.
编写一个可以读取和创建这些文件的应用程序是一件相当费事的工作,而且这些应用程序常常不能正常工作.
从Word2003以后,所有Word文档都可以被保存为带文档结构的XML格式,这样其他应用程序(如OfficeLibre)也能通过一些简单手段来创建Word文档.
现在通常可以通过文本编辑器来修复损坏的Word文档,而在以前文档损坏就意味着数据全部丢失.
由此可见XML确实是保存数据时的最佳选择.
第1章什么是XML111.
4XML的实际应用XML语言的格式和上个世纪90年代中期它刚被创造出来时几乎相同,但现在XML文件能包含的内容更加自由.
一些在初期版本时不允许使用的字符现在也允许使用了.
不过XML的应用领域以及它所衍生出的相关技术标准却有了很大的变化.
XML的管理工具也发生了巨大的变化.
在过去几年中尤为明显,五年前在浏览器上对XML数据进行的任何操作都需要大量的JavaScript的支持,也只有有限的浏览器支持XML格式的数据.
如今已经有了许多优秀的脚本库,它们使XML文件可以被很容易地发送、接受或处理.
主流浏览器上XML的差异性也在逐渐变小.
近年来XML的另一个变化是,大家对XML语言不适用的场景达成了共识,只有少数顽固分子认为XML可以用来解决任何问题.
接下来的章节会讨论不适合使用XML语言的场景.
本章涉及的XML使用场景也会在以后的章节中进一步深入讨论.
1.
4.
1数据和文档到目前为止,你在本书中看到的XML使用的例子都是以数据为核心的.
在这些例子里都是在原始数据上加上标记,使之更容易理解,更易用,并提高了数据的通用性.
另一种XML的主要使用方式是以文档为核心的.
这是一种带有元数据的较松散的数据结构(如一本书的某个章节或一份法律文件).
HTML就是SGML语言在这方面的一种应用,而XHTML则更接近于XML语言在面向文档方面的应用.
HTML的设计目的就是希望人们能更方便地阅读这些数据而不是方便软件运行.
XML的设计者则希望这些数据既能方便人们阅读也能方便软件处理.
在本书接下来的内容中,你会发现不同样式的XML数据处理方式也迥然不同.
以文档为核心的XML常用于为一个应用程序在多种平台上发布时提供重用支持.
在支持文件格式不同的介质上发布应用时非常的实用.
例如,数年前我曾经开发过一个用于提供财务培训资料的系统,后台数据库为这个系统保存了大量的文章、测验题目以及测验答案.
所有这些东西都是以注意:OfficeLibre是一款开源应用程序,它的功能和其他办公软件(如MicrosoftOffice)类似.
它最初被称为OpenOffice,当OpenOffice被Oracle收购后它便从中独立出来.
你可以在www.
libreoffice.
org上下载到它.
注意:你可以在www.
w3.
org/TR/xml上看到XML的最新推荐标准文档.
注意:我们会在第14章和第16章中详细探讨JavaScript对象标记法(JavaScriptObjectNotation,JSON),它与Web服务和Ajax密切相关.
如果你现在就希望了解到JSON的更多内容,可以访问www.
json.
org.
第Ⅰ部分XML介绍12一种类似XHTML的XML方式保存的,XHTML是HTML的XML版.
当负责准备培训资料的编辑在数据库里敲定了他所需要的培训资料内容以后,这些内容会被XSLT(详细内容会在第8章中探讨)转存为适合Web显示以及打印的格式.
在这种系统中使用以文档为核心的XML时,无论输出的文档内容需要怎么变化,都只要修改底层使用的数据就行了,因为这些修改可以被反映到当前使用的所有输出介质上.
另外,如果需要在其他介质上输出数据,如在移动终端的Web浏览器上显示,那么只需要另外指定一种转换方式就可以了.
1.
4.
2XML场景除了以文档为核心的场景外,XML也常被当作一种表现数据和存储数据的手段.
这主要是由于XML灵活的特性,而且以XML方式存储或表示的数据易于人们阅读和计算机解析.
本书的这一部分内容描述了一些XML的常用场景,并简单描述XML适用于这些场景的原因.
1.
配置文件几乎所有的现代配置文件都使用XML.
VisualStudio项目文件和Ant(Java中用于控制软件构建过程的工具)使用的构建脚本都是这方面的例子.
在配置文件中使用XML的原因在于,这种配置文件比使用传统的键值对方式的配置文件更易于解析也更容易体现层次关系.
2.
Web服务冗长的SOAP风格的服务,简洁的RESTful的Web服务,以及现在许多人都热衷的JSON,使用的都是XML.
XML可以作为一种序列化跨平台对象的便捷方法,也可以作为一种通用的应用程序返回结果集的手段.
SOAP风格的服务(将会在第15章和第16章中深入讨论)也使用一种被称为Web服务描述语言(WebServicesDescriptionLanguage,WSDL)的XML格式描述的.
WSDL提供一个Web服务和功能的完整描述,包括这个Web服务的初始化请求的格式、确认响应以及正确调用服务的细节、主机名、端口号和URL格式.
3.
网页内容虽然许多人认为XHTML(XML版本的HTML)并没有真正流行起来,而且终将被HTML5取代,但它目前仍然被广泛应用在网络上.
有许多网页内容被保存为XML格式,这些网页内容在需要时可以在服务器端和客户端之间转换.
把网页内容保存为XML格式的原因在于这些内容可以被重用,也因为这样可以节省传输带宽和存储成本.
网页内容需要以HTML表的形式显示,当XML把它和用于传输的代码一起编译时更节省空间.
4.
文档管理XML除了被用于存储通过网络提交数据的实际内容以外,它还在文档管理系统被广泛用于保存文件书签和管理元数据,常结合传统的关系型数据库系统使用.
XML用于保存文档的作者、创建日期、修订情况等信息.
把这些额外信息和文件的具体内容集中保存意味着文档的所有相关内容都被保存在一处,使这些信息在额外提取时更方便,也确保元数据在描述数据时不被孤立.
第1章什么是XML135.
数据库系统大多数现代高端数据库系统,如Oracle和SQLServer,都能保存XML格式的文件.
这对XML来说是个好消息,因为在传统的数据库中许多类型的XML数据不适合存储为关系型结构(如表和联接).
例如,一个产品表可能需要保存一些XML格式的结构信息,在网页显示或打印时需要这些结构信息.
这些信息不能被缩减为简单的表单,几乎不需要修改,或者只需要添加一个新的部分就可以为另一种语言提供支持.
如果要修改的文档在数据库中有专门的一列用于保存它所包含的XML信息,那么这种修改就非常容易而且简单.
这一列XML信息需要能以XQuery语言来进行修改,XQuery会在本章的后续内容中探讨.
Oracle和SQLServer以及一些开源数据库(如MySQL)提供了用于保存XML信息的数据类型.
这些数据类型提供访问和修改XML信息的相关方法.
6.
图像表示矢量图可以使用XML来表示.
可伸缩矢量图形格式(SVG)是目前最流行的矢量图格式.
与传统位图图像格式相比,XML格式的好处在于其表示的图像更易于操作.
图像伸缩等操作由XML支持,而不需要其他复杂计算.
7.
商务互用性如今数以百计的公司使用标准XML来描述日常交易中使用的不同实体,这是XML最广泛的应用.
详细包括:医疗数据如证券、股权、货币兑换等金融交易商用和民用不动产法律文书数学和科学公式1.
4.
3XML技术你可以使用一些相关技术、标准和模型来实现上面提到的使用场景.
这也是本书的主要内容,下面是本书内容的概述.
1.
XML解析器在对XML文档进行操作前首先需要解析它,所谓解析就是将其内容进行分解并按一定内部规则重建.
虽然XML文件是简单的文本文件,但传统的字符串处理方法(如取子串、计算字符串长度等)和正则表达式并不适合用于从中提取信息.
由于XML内容丰富,使用灵活,基于字符串的处理方式并不适合处理XML数据.
现在有许多XML解析器——有的是免费的,有的是收费的——可以很方便得到解析结果.
在本书中你会用到各种各样的解析器.
早期应用程序使用自建的XML解析器的原因之一,是无法在项目中使用当时的外部解析器,当时的外部解析器无论在使用的内存上还是占用的磁盘空间上都过于庞大而导致无法封装在项目文件中.
不过现在出现了许多高效的轻量级的解析器,这意味着自己再去开发一个解析器只是一个浪费资源的工作.
第Ⅰ部分XML介绍14下面列举了目前常见的解析器:微软的核心XML服务(MicrosoftCoreXMLServices,MSXML):这是Microsoft的标准XML工具包,包含有一个解析器.
它对外公开了许多COM对象接口,供旧版本的VisualBasic(vb6或者更低的版本)通过C++或脚本调用.
VisuualBasic最新的版本是6.
0,它已经不再开发新版本,只有关于修复地址错误和其他安全性措施的补丁包还在发布.
在你编写应用程序时很可能不会用到这个解析器,这只给你在使用旧版本IE浏览器(IE6或更低版本)来解析XML时提供一个选择.
这些旧版本浏览器使用ActiveX技术调用MSXML解析器,这在某些情况下会导致安全性问题.
IE7及其以后的版本提供了一个内置的解析器和跨浏览器的XML支持库.
如果高版本的IE浏览器可以在你的开发中使用,那么请尽量选用它.
System.
Xml.
XmlDocument:这是Microsoft的.
NET库中的一个类,.
NET库中包含大量的XML开发时使用的类.
它们都是标准的文件对象模型(DocumentObjectModel,DOM)并额外引入了一些功能,使XML的阅读、编写和处理变得更容易.
这部分内容将在下一节详细描述.
目前业内均趋于使用DOM解析器,不过微软也提供了许多其他XML处理方式,我们将会在后续章节中探讨它们.
Saxon:大多数专业XML开发团队都会认为,Saxon是一款引领XML的产品.
Saxon提供XML的解析、转化和查询工具,它来自Dr.
MichaelKay的软件公司.
Dr.
MichaelKay撰写过许多关于XML和相关技术的高级编程教材.
Saxon有一个非常友好的界面,它通过使用DOM提供XML交互.
Saxon有Java和.
Net版本,其基础版可以免费下载和使用.
Java内置的解析器:Java库也提供XML解析器.
它以功能简单但适用于处理大多数XML工作(如解析和验证文档)闻名.
你可以使用其他第三方解析器(如Apache的Xerces或Saxon)来替代它.
Xerces:Xerces是由知名开源组织,Apache软件基金会开发,它可以在Java上使用.
它是许多基于Java的XML应用程序的基础,比Java内置的解析器更常见.
2.
文件对象模型(DocumentObjectModel,DOM)一旦XML解析器完成了它的工作,就会在内存中生成相应的数据模型.
这些模型提供了提取和修改XML信息的方法.
例如,可调用诸如createElement的方法来在要输出的文档中生成新的元素,使用诸如documentElement的属性定位文档的根元素(在之前的例子中就是applicationUsers节点).
DOM是最早使用的模型之一.
当时这一模型并没有XML相关的标准,它只能用于HTML文件.
DOM的核心是使用树型结构表现一个XML文档.
从这个树型结构的根节点开始遍历整个树结构,按照使用者的要求提取或插入数据.
虽然DOM被使用了很多年,但它依然难以使用.
而且DOM需要耗费的内存也很大.
打开一个占用1MB磁盘空间的XML文件需要5MB的内存.
当需要打开大XML文件时这显然会带来麻烦.
由于DOM有这些问题,而且它只是处理XML文件的一个中间步骤,这导致了其他数据模型的出现.
不过在从XML或HTML中提取一小部分信息时,DOM还是有着广泛的应用,尤其是在跨浏览器支持上,DOM也被许多目前流行的脚本库使用,例如jQuery.
3.
DTD和XMLSchemas文件类型定义(documenttypedefinitions,DTD)和XMLSchemas均用于定义XML文档的结构和第1章什么是XML15其包含的数据.
它们可以用来验证接受的文档是否符合规定格式.
DTD是一个旧版本的标准,这个标准也被SGML囊括了.
它们目前正逐步被XMLSchemas所取代,不过仍普遍被用于(X)HTML中.
它们拥有一些XML没有的特性,如可以创建实体声明(这部分内容会在第4章中探讨),可以增加默认属性.
XMLSchemas通常提供更多功能,它们在编写XML代码上也有优点,数据和数据架构都可以使用同样的工具.
而另一方面DTD的数据和数据架构则使用完全不同的格式,这使DTD难以使用.
另外DTD和XMLSchema也都被用于帮助XML开发者验证文件.
现在大多数XML编辑器都允许用户创建指定格式的XML文件.
在用户编辑文件时,它们会提示用户可用的选择,当用户在错误的地方使用某个元素或属性时也会发出警告.
虽然人们对XMLSchemas的发展前景心存疑虑,但越来越多的人加入到使用XMLSchemas的队伍中来.
除此之外也有其他方法可以验证接受的文档的格式,比如无法使用DTDs或XMLSchemas的场景下就应该使用其他方法.
验证的替代方案将在第6章中详细介绍.
我们将在第4章和第5章中分别讨论DTD和XMLSchemas.
4.
XML名称空间在最初的XML推荐标准发布后不久,XML名称空间就被引入到XML的定义中.
它曾以难懂和难用闻名.
名称空间本质上来说是一种XML的分组方式.
如果一种或两种不同的格式需要在一起使用,它们自己的元素名就能被分组到各自的名称空间下,确保不会有歧义.
在开发人员给不同格式下的元素命名相同的名称时这种分组尤为重要.
同样的理念在.
Net和Java软件开发中一直在使用,例如开发人员设计了一个用于描述某种XML文档类,名为XmlDocument.
为了防止这个类和其他可能存在的同名类起冲突,这个类被放置于一个名称空间(.
Net术语)或一个包(Java术语)内.
这个类的全名可能就是Wrox.
Entities.
XmlDocument,这样把它和Microsoft的System.
Xml.
XmlDocument区分开.
第3章详细描述了名称空间.
5.
XPath许多XML技术都用到了XPath.
通过它可以定位指定的元素或属性(或其组建码块).
它的工作方式类似文件系统,从根节点开始按层次遍历,直到找到目标.
例如我们想在appUsers.
xml这个文件中找到所有用户.
XPath返回的路径就是:/applicationUsers/user路径遍历始于根节点(以斜杆"/"表示),选择applicationUsers元素,发现所有的user元素都位于此.
XPaths的功能十分强大,它支持多种文档遍历方式也支持针对特定区域的谓词查询.
XPath除了被用在XSLT里外也被用于XQuery、XMLSchemas和其他XML相关的技术中.
我们会在第7章中详细学习XPath.
注意:当阅读XHTML文档的源码时,会在文件开头看到类似如下内容表示的对DTD的引用:第Ⅰ部分XML介绍166.
XSLTXPath主要应用于可扩展样式表语言转换(eXtensibleStylesheetLanguageTransformations,XSLT)中.
XSLT是一种强有力的转换文件格式的方法.
起初它只能将XML文件转化为其他形式的文本文件.
从2.
0版起,它也接受任意的文本文件作为输入.
XSLT是一种描述性语言,它根据源文件使用模板定义结果.
服务器端或浏览器端在将XML转换成(X)HTML时也常用到XSLT.
在客户端做文件转换的好处是,把文件处理的表述过程放在应用层上处理,解决了显示问题.
另外还能减轻服务器端的资源占用,提高服务器端的响应时间,也减少了服务器和浏览器间需要传输的数据量.
这里有一个很特殊的案例:要处理的数据实际上是要以表格的形式展示,大部分数据内容都差不多.
这种情况下直接传递HTML数据可能导致服务器和客户端之间要传输的数据成倍地增长.
在接下来的"试一试"中,我们可以看到经过特殊设计的浏览器是如何接受XML格式的输入并把它转换成指定格式的数据.
在这里你不用深究XSLT(把它留到第8章),但你需要对XML是如何使你从看到的内容中获取你关注的数据有一个清楚的认识.
试一试XSLT在浏览器中的应用使用之前创建的appUsers.
xml文件示范如何在浏览器中实现一个基本转换:(1)使用文本编辑器在appUsers.
xml所在的文件目录下创建包含以下内容的文件,并将其保存为appUsers.
xslt:ApplicationUsersFirstNameLastName可从wrox.
com下载源代码第1章什么是XML17代码段appUsers.
xslt(2)按下面的内容修改appUsers.
xml,使浏览器在打开它时使用我们刚才创建的XSLT来转换它,而非使用浏览器内置的默认转换器.
把修改后的文件保存为appUsersWithXslt.
xml.
代码段appUsersWithXslt.
xml(3)使用浏览器打开appUsersWithXslt.
xml.
你会得到类似图1-3所示的结果.
图1-3示例说明当浏览器发现XML文件的第一行包含以下内容时:浏览器会使用我们创建的appUsers.
xslt中指定的样式来显示内容,而不是像图1-2那样使用默认样式来转换显示.
appUsers.
xslt里有两组xsl:template标签.
第一组标签指定了要显示的HTML文件的基本结构,为其绘制了一个HTML表格;第二组标签对xml文件中所有的user元素起作用,为每个user元素生成一列数据.
转换完成后,生成的代码就和传统的HTML页面代码一样.
该转换操作实际生成的代码如下所示:ApplicationUsersFirstNameLastName可从wrox.
com下载源代码第Ⅰ部分XML介绍18JoeFawcettDannyAyersCatherineMiddleton7.
XQueryXQuery与XSLT有许多共同特征,所以在XML开发时一个很普遍的问题是"该用XSLT还是XOquery呢",回答是"依情况而定.
"XQuery和XSLT类似,都能操作单文档,但它更常用于多文档处理上,当这些文档保存在关系型数据库上时这种用法更为普遍.
如果使用XQuery来处理前面的"试一试"中的appUsers.
xml文件,为其生成以表格形式显示用户的HTML页面,所需的XQuery文件如下所示:ApplicationUsersFirstNameLastName{for$userindoc("appUsers.
xml")/applicationUsers/userreturn{data($user/@firstName)}{data($user/@lastName)}}许多查询语句和前面的XSLT文件中的类似.
和XSLT文件相比,一个主要的不同之处是XQuery本身不是XML格式的.
这使需要编写的代码更少,比XSLT更容易编写.
另一方面,由于它不是XML格式的,它不能通过标准XML编辑器编写也无法被XML解析器解析.
只能通过专门的编辑器来编写,自定义构建软件来处理.
第1章什么是XML19编写XQuery与XSLT相比,主要的不同体现在语法上.
XQuery使用花括号({})标记文档中需要使用处理器处理的部分,文档其他内容则简单地逐字输出.
在上面的例子中,实际要处理的代码部分就是:{for$userindoc("appUsers.
xml")/applicationUsers/userreturn{data($user/@firstName)}{data($user/@lastName)}}这段代码使用doc()函数从外部文件appUsers.
xml中读取信息,对文件中的每个user元素创建一个元素.
XQuery将在第9章中深入探讨.
多数情况下,选择XSLT还是XQuery只由开发人员的个人喜好决定.
如果开发人员希望代码风格简洁,可读性较高,或应用程序需要处理数据库中的大量文档,那么有着简单语法且针对多文档处理的XQuery会是一个更好的选择.
如果开发人员希望代码更容易被支持标准XML的软件所解析,或者应用程序的主要功能是将现有的XML文件转换为其他格式的文件,而不是重新创建一个新文件,那么使用XSLT将是一个更好的选择.
8.
XML管道当单个步骤不能获得用户希望的输出时,就需要使用XML管道技术.
例如,我们无法用一个XML转换来应对应用程序所能接受的所有类型的文件.
这种情况下,可能需要先针对输入数据做初步的转换,然后再使用一种通用的转换方法来实现最终的转换.
另一个XML管道应用的例子是,输入数据在进行转换前需要经过验证.
过去这些管道或工作流是以非正式的方式创建的.
如今已经有了一个公认的标准来定义管道.
XProc是W3C的推荐标准,你可以在www.
w3.
org/TR/xproc上找到相关资料.
XML管道目前只有极少数的应用,不过如果你需要使用这种类型的工作流,那么XProc还是值得考虑的.
1.
5小结在XML出现前,处理二进制和纯文本文件的方式以及存在的问题.
XML是如何从SGML发展而来的XML的基本模块:元素和属性XML的利弊基于文档的XML和基于数据的XMLXML的实际应用XML相关技术,如解析器、架构、XPath、XSLT和XQuery转换第2章将讨论XML的构建规则和XML文件的不同组成部分.
注意:XQuery有一个基于XML的版本,称为XQueryX.
不过它并没有被大众接受,几乎所有在线使用的XQuery都是非XML的.
第Ⅰ部分XML介绍20习题习题的参考答案在附录A中.
1.
修改本章中的appUsers.
xml文档,移除属性而使用元素来存储数据.
2.
说明上题中创建的文件的主要缺点.
牢记数据不仅占用磁盘空间,更重要的是它需要通过网络来传输.
本章要点主题要点XML出现前大多数数据格式都是专有的,只能被一小部分应用程序所使用,不适合当今的分布式系统XML的目标提高数据通用性,使用人机均可读的文件格式,将开发人员从每次读取或写入数据时都需要编写底层代码的负担中解放出来标准化负责人无,不过许多XML规范都是由万维网联盟(W3C)制定的基于文档的XML和基于数据的XML有两种主要的XML格式:一种用于存储纯数据,如配置文件;另一种用于向文档中添加元数据,如XHTML依赖于XML的技术有数百种依赖于XML的技术,最主要的是以下几种:XMLSchemas,它用于验证文档格式;XSLT,主要用于将XML格式的文档转换为其他格式;XQuery,用于诸如保存在数据库内文档这种大量的文档集合中的查询操作;SOAP,使用XML向Web服务传递数据,接收Web服务返回的结果良构的XML本章内容:什么是良构的XML文档XML文档的组成部分XML文档是如何组织的迄今为止,你已经了解了XML之前的历史、XML出现的原因以及它的一些优缺点.
你也已经快速浏览了本书中提到的与XML相关的一些技术.
在本章中将会使用一些规则来检验一个文档是否符合XML规范.
这一知识点在两种情况下是必需的:第一种情况是,当你为自定义的数据设计XML格式时,你可以保证文档能够被标准XML解析器解析;另一种情况是,当你在设计一个从外部接收XML输入的系统时,可以保证接收到的XML的合法性.
遗憾的是,许多用于将数据导出成XML的系统却破坏了规则.
这也就意味着除非你能从根源上解决这个问题,否则只能诉诸一些非XML的工具来解决输入问题.
这就带来了大量不必要的开发工作,并且违背了使用一种通用方法来进行数据表示的初衷.
除此之外,你还会学习基本的以及高级的XML组成部分.
从最基本的元素和属性开始,了解它们如何构建为一个完整的文档的.
你还会学习描述这些组成部分的现代术语.
这也是本书较早期版本的重大变化之一,我们做了很大的努力使得XML世界能够拥有一个独立但是足够精确和广泛的处理XML的技术词汇表.
它使得XML标准能够被清晰地书写并且形成了技术发展的基础.
2.
1良构的定义纯粹地讲并没有什么所谓良构的XML.
一个文档要么是符合良好规范的XML,要么是文本.
但是通常来讲良构XML意味着它遵循W3C的XML推荐标准的如下规则:文档内容与元数据分隔方式(标记)标记的标识方式它的组成部分这些部分的显示顺序以及显示位置2第章第Ⅰ部分XML介绍22不同的XML术语当谈论XML时总会提到一个小问题就是它的组成部分有多种描述方式.
之所以会产生这些不同的描述方式,主要有两个原因:这些与XML相关的不同技术都有它们自己的行业术语,它们当中仅有少量是通用的.
例如,文档对象模型(第7章所述)与XSLT(第8章所述)对于同样一个概念有完全不同的词汇.
官方的W3CXML推荐远远滞后于XML的实际应用.
在这些文档中使用的术语往往不同于白话.
本章试图在两处坚持使用W3C推荐的两个术语.
第一个,ExtensibleMarkupLanguage(可扩展性标记语言www.
w3.
org/TR/xml),它描述了词汇表示形式.
简而言之,即XML如何在文本编辑器中创建.
第二个,InfosetRecommendation(推荐信息集www.
w3.
org/TR/xml-infoset/),描述了XML文档的理想化抽象表示.
2.
2在文本编辑器中创建XML使用文本编辑器创建XML与在Windows中使用记事本或者在linux中使用vim编辑器一样简单.
它也是我们讨论XML元素的第一步.
通过创建XML,你会逐渐创建一个示例文档.
每一步你都会认识XML的组成部分并掌握创建它们需要遵守的规则.
2.
2.
1禁止的字符在编写XML之前需要知道的第一件事就是在XML文档中有一些字符是被禁止使用的.
这些规则根据你所使用是1.
0还是1.
1版本而略有不同,1.
1版本的要求略微宽松一些.
两个版本都禁止在文档中使用null,它的十六进制表示为0x0.
在1.
0版本中,也不能使用十六进制码在0x01和0x19之间的字符,除了以下三个:制表符(0x9)、换行(0xA)和回车(0xD).
例如,不能使用字符0x7,它是响铃符(bell),因为它在某些系统发出钟声或哔声.
在1.
1版本中,尽管这些控制字符的用途不常见,你还是可以使用它们.
在下一节中你会看到如何设置特定的版本.
在Unicode规范中有一些字符同样不能在XML中使用,但是一般不会遇到这些字符.
可在W3C的XML推荐标准中找到一个完整列表.
2.
2.
2XML序言文档的第一部分是序言.
它是可选的并不一定必须存在,但是一旦出现则必须出现在开始部分.
序言以一个XML声明开始,一个最简单的形式如下所示:注意:这三个字符以及第四个字符:标准空格字符(0x20)统称为空白符,它们在XML有特殊的规则.
本章后面将介绍这些规则.
第2章良构的XML23这个声明仅包含一条版本号信息.
目前它不是1.
0就是1.
1.
有时声明还包含文档中用到的编码信息:这里编码使用的是UTF-8,它是Unicode编码的一种.
1.
使用Unicode编码编码是一个将字符转化为等价的二进制表达的过程.
一些编码只使用一个字节也就是8个比特(bit),其他则使用多个.
使用单字节的劣势在于没有追索的情况下能够被编码的字符个数是有限的.
追索是指使用一个特殊的比特序列来表明其后续两个字节代表一个字符的方法或其他相近的解决方法.
当XML处理器读入文档时,它必须知道使用的是什么编码.
但是,这又是一个"鸡生蛋"问题,如果不知道编码方式怎么能知道在声明里放的是什么字符.
这个问题的答案很简单,就是文件最开始的几个字节可以包含字节顺序标记,即BOM.
这使得解析器能够读懂声明中定义的编码方式.
一旦解析器知道了编码,它便可以解码文档剩余的内容.
如果由于某种原因,指定的编码方式并不是文档实际使用的,通常会得到一个异常或者在翻译内容时出错.
如果你想了解确定编码方式整个工作过程,你可以参照如下URL:www.
w3.
org/TR/2008/REC-xml-20081126/#sec-guessing.
Unicode是一种遵从国际化理念而设计的文本编码标准.
它试图定义每一个可能的字符,确定它的名字并分配一个代码点.
代码点是一个能够代表字符的数字.
Unicode也为每一个字符分配了一个类别,比如字母、数字或标点符号.
在本章后续部分你会看到如何在字符引用中使用这些代码点.
Unicode的两个主要使用编码系统为:UTF-8和UTF-16.
UTF是UCS转换格式(UCSTransformationFormat)的简称,UCS代表通用字符集.
当中的数字代表了一个字符使用多少个比特来表示,8或16(也就是1或2个字节).
UTF-8之所以能够使用一个字节而UTF-16需要两个字节是因为UTF-8使用一个字节来表示最常用的字符,使用两个或三个字节表示不常用的字符.
UTF-16使用两个字节表示大部分常用字符,其余的使用三个字节.
这有点像你的键盘,小写字母和数字只需要按一次,而是用大写字母和其他字符则需要使用shift键.
UTF-16的优势在于它对字符采用使用固定的两个字节来表示(极少数使用3个),这使得解码变得更容易.
而它的劣势在于当你只使用拉丁字母和标准数字以及标点符号时,它的文件大小比使用UTF-8要大得多.
所有XML处理器需要能够解析UTF-8和UTF-16,即使这些是它们仅有的能够读入的.
在没有指明编码信息的情况下UTF-8是默认的编码方式.
尽管Unicode有诸多优势,许多文档仍然使用一些其他的编码方式,例如ISO-8859-1、windows-1252或EBCDIC(一种在许多大型机上的编码方式).
你也会遇到一些使用ASCII编码的文件,这是一种基本字符集.
曾经几乎所有的文件都是通过它编码的.
ASCII是Unicode的子集,因此任何支持Unicode的程序都可以对其进行解析.
注意:当你在浏览网页时,经常会看到在一个系统中编码并在另一个系统中解码的副作用,这就是会有一些无意义的字符穿插在可读的文本中.
这是一些在一台机器上创建进而上传到第二台网络服务器上并被第三台运行着浏览器的机器阅读的文件的副产品.
如果这三台相关机器不能够正确地翻译这些编码,那么就会出现一些字符被曲解的情况.
你会注意到通常这些乱码不是ASCII编码,它们在不同系统中有不同的代码点.
第Ⅰ部分XML介绍24在实际使用中UTF-8编码可能是最好的.
因为它有一个广泛的字符集并且被所有的XML解析器支持.
在没有指定编码方式的情况下,UTF-8便是默认的编码方式.
如果你真的在创建或者解析文件遇到了UTF-8不识别字符的问题,你仍然可以轻易地通过自己创建这些字符来解决.
你将会在"实体与字符引用"一节中学习这种方法.
另外,Unicode规范随着字符增多而不断扩展.
目前的版本可在http://unicode.
org中找到.
2.
完成声明既然已经确定了使用的编码方式,你就可以完成声明了.
声明的最后一个部分决定了这个文档是不是独立的.
Example.
xml独立只应用于那些定义了DTD的文档,并且只有在使用DTD添加或修改内容时才适用.
Example.
xml并没有使用DTD(记住大多数的现代XML格式依赖于架构),因此你可以将独立声明设置为"是"或者不用管它.
如果你曾经使用过DTD,那么一个XHTML文档的例子看起来应该是这样:.
第4章将讲述关于DTD声明的更多细节.
有时XML序言还包含一些额外元素.
这些可选的内容包括注释和处理指令.
处理指令将在本章后续内容中讨论.
注释通常为人所用并且并不是文档中的实际数据.
它们以结尾.
下面是带有注释的example.
xml.
总之,注释完全是为人所读的.
你也许会将创建文件的日期、姓名以及其他作者信息包含到注释中.
不过如果你认为文件只是被软件应用程序处理,就没有必要插入它们.
一旦完成了XML序言,就需要创建文档的根元素.
接下来的部分详细描述了元素以及如何创建它们.
2.
2.
3创建元素元素是XML基本组成块,所有的文档都必须至少包含一个元素.
所有元素都是使用两种方式之一来定义.
最简单的情况,一个元素包含一个开始标签,它是一个左尖括号"".
一个完整的开始标签是.
元素的最后是一个结束标签,它由一个左尖括号、一个斜线、元素名称以及右尖括号组成.
因此注意:DTD意为文档类型定义.
它是一种定义XML格式,描述XML默认内容以及规定XML内部的引用该如何翻译的方式.
第4章将讲述DTD.
第2章良构的XML25的结束标签应该是.
你可以在开始标签的名称后面加入空格,比如,但是不能在名字前面加空格,比如.
将这个加入Example.
xml,如下:Example.
xml定义一个元素还有一种可选的语法,这种方式只适用于那些没有内容的元素:这类元素称之为自封闭元素.
1.
命名风格除了以上两种定义方式之外,元素有一些不同的命名风格,正如许多IT相关的事物一样,人们因此而受益.
一种几乎大家都公认的风格是保持一致性.
选择一种文档风格并贯穿始终.
以下是一些如何命名元素的命名风格,它们的主要思想是如何在元素名中区分单词.
Pascal-casing:将包含第一个单词在内的首字母大写:Camel-casing:与Pascal相似,区别是第一个单词字母小写:.
Underscorednames:使用下划线来分隔单词:.
Hyphenatednames:使用连字符分隔单词:.
还有一些其他的命名风格,不过这四个似乎效果最好.
2.
命名规范在对元素进行命名时,除了使用命名风格之外,也有一些你需要遵守的命名规范.
主要规则如下:元素名可以是下划线或是Unicode字符集中任何大小写字母.
这就意味着你可以使用在英语和许多其他西方语言使用的罗马字母,在俄语及其相关语言使用的西里尔字母,希腊字母,或者许多其他在Unicode标准中定义的文字,例如泰语一级阿拉伯语等.
后缀字符可以是连接符或数字名字区分大小写,因此开始和结束标签必须精确匹配名字不能包含空格所有以XML开头的名字,无论大小写,都是预留的并且不能被使用(尽管实际上许多解析器也允许这种情况存在).
注意:元素名称是大小写敏感的并不意味着使用两个仅仅通过大小写区分的做法是明智的,例如和.
正如在C#之类的大小写敏感编程语言中是一种不好的实践那样,在XML中不应该让元素有相似的名称.
第Ⅰ部分XML介绍26理论上你可以使用冒号":"作为名称的一部分,但是这和XML名称空间(第3章讲解)的处理方式相冲突,因此在实际中应避免使用.
如果你想查看完整的元素命名规范,请访问:www.
w3.
org/TR/2008/REC-xml-20081126/#NT-Name.
.
正确的规范元素对于创建一个良好规范的XML是至关重要的.
表2-1提供了一些正确以及错误构建元素的例子.
表2-1合法与非法的元素合法元素原因非法元素原因名字之后可以有空格名字中不能包含空格名字内部可以包含数字名字不能以数字开头在自关闭元素中,名字与斜线之间可以有空格禁止在开头使用空格名字内部可以出现连字符第一个字母不能是连字符Unicode定义的非罗马字母也是允许出现的.
本例中元素名称为希腊语"名字"开始与结束标签必须大小写一致3.
根元素写完序言的下一步就是创建根元素.
所有的文档都必须有且仅有一个根元素.
文档中其他元素在根元素下形成一个分层树.
只能有一个根元素是XML的基本规定之一.
不过这也招致了许多抱怨,许多人提出了一些比较适合拥有多个根元素的例子.
例如当使用XML作为日志格式时,一个典型的日志文件如下:FailedlogonattemptwithusernamejfawcettSuccessfullogonattemptwithusernamejfawcettSuccessfulfoldersynchronisationforusejfawcett这种格式很易于管理.
每当机器试图添加一条记录条目时,它只需要打开相应的文件在最后写入一行.
这可以说是所有系统的一个标准操作.
但是这种格式的问题在于它并没有唯一的根元素,你必须添加一个根元素使得它符合良构性.
FailedlogonattemptwithusernamejfawcettSuccessfullogonattemptwithusernamejfawcettSuccessfulfoldersynchronisationforusejfawcett但是现在由于仅有一个根元素,要想添加新的条目是很难的.
一个简单的文件记录器不得不打开文件并找到结束日志标签(),然后才能添加一个新行.
除此之外,也可以使用解析器来打开第2章良构的XML27文件,找到根元素(),在它所有的孩子元素之后添加一个新的.
这个过程需要更多处理,当每分钟需要增加几十个条目时可能会带来问题.
尽管如此XML标准委员会仍然坚持他们的观点,他们认为拥有一个独立的全方位的根元素(主要一点是它更容易解析)比它所带来的诸如创建日志文件的问题更为重要.
不过他们已经认同有必要有这样一种结构,我们称之为文档片段.
文档片段不需要有一个根元素,但却不能被单独处理.
它们需要嵌入到一个有唯一根元素的文档中进行处理.
这个过程可以有许多方法来实现,第4章的"实体声明"一节会介绍其中的一些.
4.
其他元素根元素下面可以是遵循相同命名规则的其他元素、属性,也可以是之前提到的自由文本.
这些嵌套的元素可以用来表示独立或重复的数据,这取决于你想怎么表达.
例如,根节点可以是,它下面的元素可以表示一个人的特征,比如和.
根元素也可以是,它下面可以有一个或多个元素,每个都有自己的子元素.
可以向示例文档添加更多的元素和注释,如下:]>Hereissometextwithanon-breaking spaceinit.
Somemoretext记住所有元素必须嵌套在根元素之下,因此下面这种有可能在HTML中侥幸通过的标记方式是不允许出现的:不能让元素的结束标签在它所嵌套的元素的结束标签之前出现.
2.
2.
4属性元素是XML的两大组成要素之一,另一种就是属性.
属性是一个与元素相关的名称-值对.
可在示例文档中添加许多属性,如下:属性的命名风格应该与元素所选择的风格保持一致.
因此不要混淆搭配成这样:.
即元素使用camel-casing风格而属性使用连字符风格.
属性也有一些规则:属性由名称与取值组成,中间用等号连接.
属性名的命名风格与对应元素的风格一致,如上例:myFirstAttribute.
属性值必须使用引号.
你可以自主选择使用单引号或者双引号.
可以在一些属性中使用单引号,另外一些属性中使用双引号,但是却不能在同一个属性中混用.
属性必须有取值部分,即使它可以是空引用.
不允许有像HTML中可能出现的出现.
每个元素中的属性名必须唯一.
如果使用双引号作为分隔符,则在取值部分不能使用它们.
对单引号同样适用.
表2-2列举了一些正确和错误的使用例子:表2-2合法与非法属性合法属性原因非法属性原因单引号可以出现在双引号之中属性名不能以数字开头双引号可以出现在单引号之中单引号不能出现在单引号之后两个属性名称不能相同分隔符不匹配2.
2.
5元素与属性内容属性值与元素均可包含字符数据(通常称之为文本).
在之前的代码段中已经出现过属性值的例子.
类似元素的例子如下:Hereissomecharactercontent除了之前介绍的规则,对于字符内容也有两个额外限制.
有两个字符不能出现在属性值或者元素内容中:取值符(&)和左尖括号(>""''引用以取址符开始和以分号结束.
实际的引用出现在中间部分,它们是字符的缩写.
例如,lt代表lessthan(小于).
因此不能使用&或]>Hereissometextwithanon-breaking spaceinit.
DTD(第4章会详细描述)声明根元素名称为myElement,之后是一个实体声明.
无论 在文档的任何地方出现,解析器都会将其作为Unicode字符A0来处理,也就是一个"插入空格".
这种方式也可用来给多个字符添加引用.
比如你想为版权创建一个引用,当你在任何地方输入©right时都会输出Wrox2012.
如果你想改变所有的引用都读入Wrox2013,你可以只在一个地方更新DTD.
其实现方法与前例类似,如下:第Ⅰ部分XML介绍30]>更多引用类型参见第4章.
2.
元素与属性的取舍在许多情况下必须对使用元素还是属性来代表数据进行选择.
列举第1章中的appUsers.
xml的例子来讲(程序清单2-1):程序清单2-1appUsers.
xml可以选择使用元素来代表用户的名和姓,如程序清单2-2所示:程序清单2-2appUsers-elementCentric.
xmlJoeFawcettDannyAyersCatherineMiddleton在使用元素还是属性上并没有固定的规则,但是下面是一些在做决定时需要考虑的东西.
使用属性的时机当只有一条数据需要展示时,属性往往是一个好的选择.
在列表2-1中一个人只能有一个名字,因此使用属性是最佳选择.
属性名不能重复,在属性中放入一个用逗号分开的角色名字列表将使提取并修改这些数据变得困难.
因此,如果需要为用户展示多次类似角色名这样的数据,则不得不使用元素.
警告:务必记住,不能通过实体或字符引用的方式将禁止字符(例如null)加入到文档中.
第2章良构的XML31使用属性会使文件变小,因为每个包含数据的元素中都需要一个结束标签和一个尖括号的小开销.
这就意味着同样的数据量,元素会使用更多字符.
当文件需要经常在网络上传输而带宽有限时,这是一个值得考虑的问题.
通常情况下,除非有特别原因,使用属性是一个好的选择.
使用元素的时机当数据不是一个简单类型时,使用元素是非常有用的.
所谓简单类型数据是指一些能以字符串形式作为属性值表达的一些文本或日期.
因此像地址这种数据,最好按其组成部分分开以元素的形式展示,而不是通过具有分隔符的字符串将其挤压成属性值的形式来展示.
因此可以这样使用:ChapterHouseCrucifixLaneLondonSE13JWEngland而不是这样:当条目需要重复时也最好使用元素.
为了将角色名关联到前面所述文件中的用户,最好使用下面这样的结构:注意到每个角色只有一个名字,因此那部分使用的是属性而不是元素.
另一个使用元素的好处是它可以排序,而属性是无序的.
可以将属性按照某种顺序放置在文档中,但是XML解析器在处理时会忽略这种先后顺序.
如果需要数据条目保持某种特殊顺序,就需要选择元素.
其他使用元素的最主要场景是当需要有大量文本数据需要展示时.
从技术角度看,你也可以在这种情况下使用属性,但你会得到一个如下所示的文件:这看起来很不规范.
当一个文件拥有大量文本时,使用元素表示内容是更加直观的.
可以使用元素中的CDATA来防止转义特殊字符.
2.
2.
6处理指令XML文档的另一个通用组件是处理指令.
你已经在第1章中使用基于浏览器的XSL转换中见过一种处理指令.
处理指令(PI)用来与使用XML的应用进行交互.
它并不能直接被XML解析器使用.
处理指令明确了哪个应用应该执行指令以及它所需要的数据.
一个常用的处理指令的例子是通知浏览器对XML进行转换,如下所示:1kilometer<1mile1pint<1liter1pound<1kilogram如果你更倾向于在文本中直接使用更易读写小于号(注意:处理指令与XML声明看起来很相似,但是声明从技术角度看并不是一个处理指令,它也不能像处理指令那样处理.
第2章良构的XML33CDATA节以结束.
CDATA中的任何字符都会被当成纯文本而非标记,因此你可以在其中使用任何通常都需要进行转义的字符,比如小于号和取址符.
如果需要表示CDATA节的结束符]]>,可以将其转义为:]]>.
CDATA通常在XHTML中使用,它是HTML的XML版本.
当在XHTML网页中嵌入JavaScript代码时,许多字符通常都需要转义.
这常常会给Javascript解析器带来麻烦.
相较而言,你可以像下面的例子一样将整个脚本部分放在CDATA节中.
这个例子用来测试一个顾客是否试图转移出超过他账户余额的钱.
//0&&transferAmount由于文本被嵌套在CDATA节中,你就可以在其中书写标准格式的javascript了.
相反如果测试的是转移的钱是否小于当前账户余额,你还需要转移&&和0&&transferAmount<currentBalance)这样的一行代码无论是人还是脚本解析器都很难翻译.
另一点值得注意是在CDATA节的开始和结束符之前出现的Javascript注释符(//).
这是为了让一些较老的浏览器知道如何处理这种结构.
记住,CDATA节只是为了让人更容易理解.
XML解析器在处理上述两个例子时是没有区别的.
一旦XML已经被解析,就无法知道字符是通过引用还是CDATA转义的.
有人使用CDATA将一个XML文档嵌套在另一个里面,如下:Thisisbadpractice]]>这类XML很难工作,它应该被禁止.
正确地处理多个文档而不让它们互相混淆的方式是使用名称空间,这将在第3章介绍.
第Ⅰ部分XML介绍342.
3高级XML解析迄今已经介绍了XML文档所有的通用组件,下面来介绍一些更高级的组件.
下面是三个与高级XML解析相关的主要讨论议题:XML等价性——通过不同方式创建的文档如何能够被XML解析器等价地解析.
空白处理——空格与制表符如何被特殊对待错误处理——文档包含错误的后果2.
3.
1XMl等价性XML等价性是指文档虽然有不同的词汇表达方式,但是却能被XML解析器一视同仁.
一旦文档被解析,将无法知道创建XML过程中是否使用了某种特殊风格.
如下面两个文档所示,程序清单2-3和程序清单2-4有三处不同:程序清单2-3文档1Here'ssomemoredata程序清单2-4文档2ThisissomeexampledataHere'ssomemoredata三个词汇上的差异体现在:(1)第一个文件中属性值使用双引号,第二个使用单引号.
(2)第一个文件中的第一个元素中使用了CDATA节,而第二个没有.
(3)第二个文件在第二个元素中对撇号(')使用了实体引用,而第一个没有.
这两种表述都没有问题,完全取决于个人喜好.
一旦其中一个文件被解析之后,你将无法确认哪个是它的源文件.
对于解析器来说,属性值如何被引用以及其他的区别,对于XML的核心表述没有任何影响.
因此,这些文档便实现了XML等价性.
多个版本的XML文档却形成一样的内存表述,这个现象也有一些消极的影响.
例如,当你在转换文件时,如果希望能够将CDTA节中的数据与之外的文本区别对待,很遗憾这只能通过其他方式来实现.
如果你想这样,可以通过其他的方式来处理这种变化.
你可以使用一个非XML的工具对文件进行预处理,在那些需要特殊处理的元素上添加标记识别符.
类似地,在XML论坛中的一个普遍需求是希望能创建一个XML文档,它包含各种由引用而不是它本身所表示的字符.
这与程序清单2-4类似,其中撇号用'来表示.
原因在于处理XML的软件"需要"这种特殊格式.
事实上由于这两种格式是XML等价的,这说明接收应用程序并兼容XML,否则这两种格式它都会接受.
处理这种需求最好的方式是丢回去让开发者去修改相关的应用程序.
显然有时这也是不太可能的,但是再怎么样也无法坚持一个单引号的表示方式.
如果你第2章良构的XML35并没有从根源上解决这个问题的话,你将不得不找一个非基于XML的解决方法来满足这个特殊需求.
2.
3.
2空白处理空白符由空格符、制表符、换行符、回车符组成(对应Unicode编码为0x20、0x9、0xA和0xD).
空白符并不包含本章前面介绍的广泛使用在网页上的"插入空格".
尽管"插入空格"并可不见,但是它也和其他字母或标点符号一样被处理.
空白符看上去并不会带来麻烦,人们读文档时也经常遇到空白行或有时两个空格连在一起的情况.
但在XML中空白符需要小心使用,主要有如下两个原因:首先,有时空白符是有意义的.
拿一个标准的英文句子为例,每个单词都依靠空格来区分.
如果没有这些空格,文本将会非常难读.
另一方面,有时空白符则是无关痛痒.
许多书籍在开头和最后都会有一些空白页,这些不会被错过但是也不会增加内容.
XML中的情况也类似,很快就可以看到一些相关的例子.
空白符在XML中之所以重要的第二个原因是由于不同的操作系统对于文件的行尾结束符有不同的转化方式.
行尾结束符由换行符和回车符组成.
例如在Windows生成的文件的行尾结束符是:回车+换行,这是为了模拟旧打印机的动作.
相反,在UNIX环境中创建的文件的行尾结束符却只有一个换行符.
空白符的处理规则使得XML文档成了便携式数据格式,保证了它的一致性体验.
比如,当处理XML文件时,行尾结束符(无论是回车加换行、换行或者是回车)都统一转换成换行符.
有意义的空白符与无意义的空白符空白符在XML文档中被XML解析器处理的方式与在HTML中被浏览器处理的方式有很大的不同.
如果你熟悉HTML开发你就会知道连续的空白字符会被合并,并且换行符和回车符通常会被忽略.
下面的HTML标记例子中在单词之间有许多空白字符,中间有两个换行符,如下:HereissometextwithlotsofwhitespaceThatwon'tshowinabrowser图2-1显示了在浏览器中的效果.
图2-1可看到连续空格和换行符都没有被显示.
这是因为HTML浏览器将多个空格合并成一个并且忽略了换行符.
如果你想在HTML中显示一个换行符需要使用元素来标记.
XML并不像HTML那样严格,解析器保留了那些不属于标记部分的空白字符.
如下面的代码段所示:XMLstandsforExtensibleMarkupLanguage(presumablytheoriginalauthorsthoughtthatsoundedmoreexcitingthanEML)andhasfollowedapathsimilartoothersinthesoftwareandITworld.
第Ⅰ部分XML介绍36在这个设计中,元素中不会直接添加任何文本内容,而仅包含元素.
因此,在开始标签后面的空白和一般缩进只是为了使文档更加易读和易懂.
在元素的名称和属性title之间也有一些空格.
所有这些空白都是毫无意义的.
而在元素中出现的空白都是有意义的.
XML解析器可以选择忽略没有意义的空白,但是它如何知道该元素没有直接的文本内容呢如果文档有XMLschema或者DTD的话它也只能知道元素的内容类型.
Schema和DTD将会在第4、5章中完整介绍,我只想说无意义的空格不需要被解析器保留.
如果你确实想让文档中所有的空格保留,可以在根元素或者其下的元素中添加一个特殊的属性:xml:space="preserve".
这会告诉解析器文档完整地保留.
将其加入到前面所述例子中的元素:XMLstandsforExtensibleMarkupLanguage(presumablytheoriginalauthorsthoughtthatsoundedmoreexcitingthanEML)andhasfollowedapathsimilartoothersinthesoftwareandITworld.
如果你想将空白符处理设置回默认值,可以使用xml:space="default".
2.
3.
3错误处理为了确保你的文档符合XML规范,你需要解决一些障碍,例如:匹配标签、引用属性值、必要转义字符等.
当XML解析器发现其中一条规范被打破时,它有两种处理方式.
这取决于标准将其定义为"错误"还是"致命错误".
可从一个错误中恢复并继续进行文档解析.
而致命错误,正如它的名字那样,是不能恢复的.
解析器只能选择报告该问题.
如果必要时它也会报告其他错误,但是处理的最后将不能产生一个解析之后的文档.
和良构性相关的错误都是致命的.
之所以采取这个严格的规定是因为看到了允许HTML开发者使用宽松的语法而对网络造成了不利的影响.
浏览器接收了错误的HTML,它便尝试猜测作者的意图.
由于每种浏览器对于错误格式的内容有着一套不同的规则,这使得该HTML页显示方式不统一.
这也意味着如果浏览器没有首先将内容通过各种算法提取有用信息,它将很难对网页进行处理.
这也是基于的XML的HTML(XHTML)为了解决的问题之一.
遗憾的是在实际中却很难起效,因为它对于大多数人而言很难学习.
此外,它也缺乏足够的工具集支持,许多浏览器,特别是IE,不能正确地处理它.
最后可以比较一下XML和标准的编程语言严格错误检查机制.
一些在编译时就进行严格类型检查,另一些则只在运行时出错.
XML的观点是尽量早些发现错误.
这也意味着可能由于微小的瑕疵而导致文档解析失败.
警告:如前所述,除非XML解析器断然知道这些空白是无意义的,否则它必须对其保留.
遗憾的是微软基于COM的解析器(MSXML核心服务)并不是这么处理的,它会将它认为无意义的空格忽略掉.
这给过去那些被迫使用这种解析器的开发者(例如使用IE工作的开发者)带来了许多问题.
在某些情况下可以通过将解析器的preserveWhitespace属性设置为true来解决这个问题.
第2章良构的XML37大部分浏览器都有良好的错误报告机制,这也经常用来寻找那些文档不明显的错误.
它们非常严格,即使遇到那些没有被定义为致命的错误也会终止处理.
这一点对于几乎所有浏览器都很常见.
这也符合只报告它们"可能"恢复的标准.
在实际中,遇到错误时终止处理比试图通过猜测作者意图来修复它要容易得多.
这会使解析器在处理文档时产生差异,会遇到之前提到的网页处理时我们不想看到的相似问题.
下面的"试一试"故意创建了一个格式错误的文件用以证明浏览器中如何进行错误报告.
试一试用浏览器寻找错误要了解浏览器如何报告错误,请使用下列代码:Thequickbrownfoxjumpsoverthelazydog.
Packmyboxwithfivedozenliquorjugs.
Glibjocksquiznymphtovexdwarf.
Thefiveboxingwizardsjumpquickly.
Whatyouwritedeservesbetterthanajiggling,shaky,inexact&questionablyfuzzyapproximationofblurXmlFileWithErrors.
xml该文件包含3个错误.
它们可能不是很明显,这取决于你对XML的熟悉程度以及校对能力.
在图2-2中浏览器对这些错误的报告形式与你自己所想的可能有所不同.
在本例中浏览器在报告错误之后停止工作并将到该点为止的内容尽可能显示出来.
示例中使用的是谷歌的Chrome浏览器.
(1)在本地浏览文件,会看到第一个错误报告,如图2-2所示.
图2-2(2)仔细查看源文件,可以看到createdOn属性使用了不匹配的引号——使用双引号开头却使用单引号结尾.
但是这并不是报告的错误.
解析器报告有一个未转义的元素的开始标签为而结束标签为,标签必须大小写匹配.
但是这次已经读入了一些内容,所以开始的三个元素的内容显示了出来.
修改这个不匹配并重新打开文件,会报告最后一个错误,如图2-4所示.
图2-4(5)这个有点让人疑惑的报告声称有一个实体引用没有名称.
这是因为在XML中正如之前描述的那样取址符(&)用来开始一个字符或实体引用.
在文件中没有名称也没有结束分号,因此解析器认为是引用异常,而不是给出忘记转义&这种简单的解释.
修改最后一个错误,图2-5所示为整个文件的内容.
图2-5这次文件显示为一个熟悉的树型,可以看到注释,也可以展开和折叠各个部分.
示例说明XML解析器在检查错误时使用的是一种序列化的方式.
它们开始通读文件,一旦发现错误立即报告,并停止进一步的解析工作.
这就解释了为什么Chrome每次只显示一个错误,当修改了错误之第2章良构的XML39后,解析器便可以进一步解析下面的内容.
直到所有三个错误被修复,浏览器就可以显示整个XML.
仔细阅读XML标准以了解更多关于哪些错误是致命错误而哪些不是的规定.
致命错误需要被明确指出,其他损害都是可恢复错误.
正如之前所述,大部分解析器将错误全部归结为致命错误.
关于这一点的最佳实践是确保所有创建的文件都不包含错误,所有接收的文件都是正确的.
如果确实收到了包含错误的文件,在不能拒绝它们的情况下,你的最佳选择是在将它们送入XML处理流程之前使用非XML的方法修正这些错误.
既然你已经了解了XML文件的组成构建块,创建XML文件时需要遵守的规则以及错误发生时如何报告,就可以进入下一个阶段了.
下一节将讲述解析后的文档是什么.
2.
4XML信息集在W3C的XML推荐规范出版之后又提出一个新的需求,即如何以一种通用的方式来对解析之后的XML文档的结构进行定义.
迄今为止有许多方法可以对文档进行描述,这取决于其所使用的技术.
文件对象模型(DOM)包含元素和属性这些不同类型的节点,也包含注释和处理指令的其他构建块.
其他技术(后续章节会介绍)有其他的方式,新模型的部分工作就是要拿出一个通用的词汇表.
新模型也旨在抽象出由不同方式创建的文件的个体差异性,比如该文档是否使用单引号或双引号来标记属性值.
此外,新模型使得XML相关应用(例如用于转换XML的应用)能够工作在一个理想化的文档结构之上.
这个新模型就叫做XML信息集,通常简称为XMLInfoset.
XMLInfoset共包含11个组件.
这一节简要回顾了每一个组件以及它如何进行相关的词汇表述.
这些组件的官方名称为:信息项.
2.
4.
1文档信息项每一个XML文档都拥有一个文档信息项.
这个信息项使得程序能够在访问其他信息项的同时,也能够处理它本身的一系列属性.
这些属性包括在XML声明中定义的字符编码属性以及文档独立属性等.
其他属性包括基本URI和文档元素等.
基本URI是一种指向文档源文件的指针.
文档元素是最外层的元素(也就是目前提到的根元素).
在旧的DOM术语中,文档信息项与XML的根节点最相似.
当需要从当前信息项导航到其他项时,可使用文档元素属性.
文档元素属性是指根元素和子属性.
使用子属性可以访问任何XML序言(根元素之前的内容)中的注释或者处理指令.
2.
4.
2元素信息项使用元素信息项可以访问任何元素相关的信息,每个元素都有一个相关的元素信息项.
元素信息项有许多的属性,包括:注意:如果你想知道文件的内容,一个pangram就是在一种语言中每一个字母表的字母都至少使用一次的句子.
第Ⅰ部分XML介绍40本地名称:没有任何名称空间前缀(第3章会介绍)的元素名称.
例如,和的本地名称为pangram.
孩子:在该元素之下的任何元素、注释、处理指令以及引用.
属性:该元素的所有元素的无序集合.
注意属性并不是元素的孩子.
双亲:将该元素作为孩子的元素.
如果该元素为文档元素则为文档.
2.
4.
3属性信息项使用属性信息项可以访问元素中的任意属性.
其包含属性如下:本地名称:与元素一样,它是一个没有任何名称空间前缀的名称.
归一化值:一个经过了标准空白字符归一化以及将所有引用展开化的属性值.
例如将多种行尾符统一成一个换行符后的属性值.
属主元素:该属性信息所处的元素.
2.
4.
4处理指令信息项文档中的每一个处理指令都有一个对应的处理指令信息项.
它包含PI的目标以及剩余文本的内容.
虽然并不是强制性的,它的内容经常会被分隔开来而被当成名称/取值结合,这有点像属性.
因此信息项并不会进一步去处理内容.
2.
4.
5字符信息项理论上将任何文档中出现的字符,无论它是一个字符引用还是一个CDATA中的字符,都会有一个相关的字符信息项.
它包含如下属性:字符编码:标识字符编码从0到#x10FFFF的值.
这些编码符合ISO10646标准定义,也就是说它和Unicode编码是一致的.
由于一些诸如0之类的编码不能出现的XML文档中,因此如果XML符合良好规范,你不会在文档中看到这些编码.
元素内容空白:这是一个标识元素中的字符是否是空白的布尔值.
双亲:将其作为子属性的元素.
在实际中XML应用程序经常将多个字符连接成字符串,因为你肯定不想每次只处理一个字符.
2.
4.
6注释信息项注释信息项是指源文档中的注释.
它只有两个属性:内容,也就是注释内的文本和双亲.
2.
4.
7名称空间信息项文档内的每个元素都有一个其所属域内名称空间的信息项.
名称空间的精彩内容将在第3章介绍.
2.
4.
8文档类型声明信息项如果一个文档包含文档类型定义,那么它就一定有一个文档类型声明信息项.
它的属性包含可以使XML具有检索DTD功能的系统标识符、公共标识符等.
这种信息项(也包括如下三个:意外的实体引用、未解析实体和符号)只有当文档具有文档类型定义时才适用.
第2章良构的XML412.
4.
9未扩展实体引用信息项几乎不可能遇到这些信息项,它们是一些还未被扩展的外部实体的占位符.
不过大部分解析都将会扩展这些引用,它们很少见.
2.
4.
10未解析实体信息项这些同样是在DTD中定义的,一般也不可能遇到.
2.
4.
11符号信息项DTD中定义的每个符号都有一种对应符号信息项.
符号通过在DTD中声明一个引用,可将类似图片格式的非XML内容引入到XML文档中.
XML信息集还有一个版本叫做后架构验证信息集(PSVI).
正是基于XML有一个相关的架构并且使用它来验证这个事实,PSVI又引入了一些额外信息.
在第5章中将会介绍这些额外的信息.
2.
5小结良好规范XML的含义XML文档中不能出现的字符编码的含义以及Unicode的含义XML的基本构建块,包含元素和属性这些构建块的组成方式以及遵循的规则某些字符的转义方式以及所选编码之外的字符的表示方式空白字符的处理方式错误的处理方式选择元素或属性时的参考建议XML信息集以及它成为XML文档理想化模型的方式习题习题的参考答案参见附录A.
1.
下面文件有哪些不符合良好规范的错误Arms&TheManGeorgeBernardShawComedydealingwiththefutilityofwarandthehypocrisyofhumannature.
TheMousetrapAgathaChristieAtraditionalwhodunnitwithanextraordinarytwist.
第Ⅰ部分XML介绍422.
在使用实体引用来定义你的邮箱地址时,如何做到需要修改时只需进行一处修改而不是多处.
请给出完整示例.
本章要点主题要点XML必须符合良好规范的原因如果XML不符合良好规范,它就不是XML,也就不能被XML解析器解析某些字符不允许出现在XML中空字符(0x0)被禁止在XML1.
0中使用,它也是XML1.
1中唯一禁止的Unicode字符.
XML1.
0还禁止使用除了空格字符(0x9)、换行符(0x1)和回车符(0xd)之外的所有0x1到0x19之间的字符某些字符具有特殊含义&和<用于引用和标签.
当需要将其作为文本使用时,需要将它们转义为&和<XML文件可以有多种编码如果文件不是使用UTF-8编码,则必须在XML声明部分进行声明基本结构XML文件由元素和属性组成.
XML文档必须有一个全包括的根元素或文档元素空白字符需要特殊处理除非解析器认为这些空白字符有意义,否则通常将换行和回车符组成的行尾结束符替换为一个换行符,将多个空格压缩成一个元素和属性通常结构复杂或者重复的数据选用元素.
而单独原子性的数据选用属性XML信息集信息集是XML文档被成功解析后的一个理想化版本.
为了不依赖于由于文档的不同创建方式而产生的细微差别,使用XML的应用应该遵循这种架构
传统农历新年将至,国人主机商DogYun(狗云)发来了虎年春节优惠活动,1月31日-2月6日活动期间使用优惠码新开动态云7折,经典云8折,新开独立服务器可立减100元/月;使用优惠码新开香港独立服务器优惠100元,并次月免费;活动期间单笔充值每满100元赠送10元,还可以参与幸运大转盘每日抽取5折码,流量,余额等奖品;商家限量推出一款年付特价套餐,共100台,每个用户限1台,香港VPS年付199元...
SoftShellWeb是一家2019年成立的国外主机商,商家在英格兰注册,提供的产品包括虚拟主机和VPS,其中VPS基于KVM架构,采用SSD硬盘,提供IPv4+IPv6,可选美国(圣何塞)、荷兰(阿姆斯特丹)和台湾(台北)等机房。商家近期推出台湾和荷兰年付特价VPS主机,其中台湾VPS最低年付49美元,荷兰VPS年付24美元起。台湾VPSCPU:1core内存:2GB硬盘:20GB SSD流量...
小白云是一家国人自营的企业IDC,主营国内外VPS,致力于让每一个用户都能轻松、快速、经济地享受高端的服务,成立于2019年,拥有国内大带宽高防御的特点,专注于DDoS/CC等攻击的防护;海外线路精选纯CN2线路,以确保用户体验的首选线路,商家线上多名客服一对一解决处理用户的问题,提供7*24无人全自动化服务。商家承诺绝不超开,以用户体验为中心为用提供服务,一直坚持主打以产品质量用户体验性以及高效...
css选择器为你推荐
长江航道周服务信息深圳做网站-确认收货手太快网店发来空箱子generatingcsswin7telnet怎样开启Windows7系统中的Telnet服务联通版iphone4s联通版iPhone4s 用联通3G卡好还是移动的好win7如何关闭445端口如何关闭WIN7自动配置 IPV4 地址 169.254chromeframe我的Chrome Frame为什么不能使用?css选择器CSS中选择器包括 A,超文本标记选择器 B,类选择器 C,标签选择器 D,ID选择器迅雷下载速度迅雷下载速度很慢怎么办morphvoxpro教程morphvox是什么 morphvox怎么使用 morphvox设置方法
重庆域名注册 中国万网域名 godaddy主机 服务器日志分析 智能骨干网 dd444 爱奇艺vip免费领取 支持外链的相册 常州联通宽带 789 英国伦敦 apnic 国外免费网盘 石家庄服务器 privatetracker 德国代理 火山互联 ddos攻击 主机游戏 sockscap下载 更多