2008-08-27

XML基础知识概要

  终于到传说中我因为在高中的时候没有学习而最后悔的XML了。本文假定读者熟悉HTML
  XML(eXtensible Mark-up Language),类似与HTML又不同,关键在于它可以自定义自己的标记符和属性,所以是extensible。
  与HTML不同的是,XML一般用于存储数据、处理数据和交换数据。

基本规则:
  XML采用层次数据结构规则。我们总能让XML文件与一个树型数据结构互相转换。
  与HTML类似,XML的标记也是成对出现的,嵌套时同样对称存在。标记也允许若干参数与属性。注释和HTML一样都是<!-- comments -->.

  在xml中所有的参数的值必须使用单引号或者双引号包围。

  只有严格符合XML标准的文档才是格式良好的xml文档。
  注意,XML大小写敏感。
  
文档类型定义DTD:
  为了对数据的合法性进行验证,XML文件一般会有一个文档类型定义(Document Type Definition),指定元素应该以怎样的规则保存。他定义了某个标志符是否存在,存在的顺序和嵌套法则。
  XML的一个重要的特征是名字空间,学过C++和Java都很清楚这个概念。XML支持名字空间,因而定义的标记符不会和其他人的类似名字的标记符冲突。要在DTD中定义名字空间只需要在元素的标记符中增加一个xmlns属性。

一个经典的DTD演示了XML的强大功能:

<!-- DTD for Shakespeare J. Bosak 1994.03.01, 1997.01.02 -->

<!-- Revised for case sensitivity 1997.09.10 -->

<!-- Revised for XML 1.0 conformity 1998.01.27 (thanks to Eve Maler) -->



<!ENTITY amp "&">

<!ELEMENT PLAY (TITLE, FM, PERSONAE, SCNDESCR, PLAYSUBT, INDUCT?,

PROLOGUE?, ACT+, EPILOGUE?)>

<!ELEMENT TITLE (#PCDATA)>

<!ELEMENT FM (P+)>

<!ELEMENT P (#PCDATA)>

<!ELEMENT PERSONAE (TITLE, (PERSONA | PGROUP)+)>

<!ELEMENT PGROUP (PERSONA+, GRPDESCR)>

<!ELEMENT PERSONA (#PCDATA)>

<!ELEMENT GRPDESCR (#PCDATA)>

<!ELEMENT SCNDESCR (#PCDATA)>

<!ELEMENT PLAYSUBT (#PCDATA)>

<!ELEMENT INDUCT (TITLE, SUBTITLE*, (SCENE+|(SPEECH|STAGEDIR|SUBHEAD)+))>

<!ELEMENT ACT (TITLE, SUBTITLE*, PROLOGUE?, SCENE+, EPILOGUE?)>

<!ELEMENT SCENE (TITLE, SUBTITLE*, (SPEECH | STAGEDIR | SUBHEAD)+)>

<!ELEMENT PROLOGUE (TITLE, SUBTITLE*, (STAGEDIR | SPEECH)+)>

<!ELEMENT EPILOGUE (TITLE, SUBTITLE*, (STAGEDIR | SPEECH)+)>

<!ELEMENT SPEECH (SPEAKER+, (LINE | STAGEDIR | SUBHEAD)+)>

<!ELEMENT SPEAKER (#PCDATA)>

<!ELEMENT LINE (#PCDATA | STAGEDIR)*>

<!ELEMENT STAGEDIR (#PCDATA)>

<!ELEMENT SUBTITLE (#PCDATA)>

<!ELEMENT SUBHEAD (#PCDATA)>

这份文档是XML的创始人Jon Bosak写的,你可以从http://saxon.sourceforge.net/saxon6.5.5/samples.html#shakespeare这里找到


XML文档:

  每个XML文档都有一个逻辑和物理结构。

  物理上,文档是由称为Entities的单元组成,实体都有内容,并且都是实体的名字标识的。尸体可以是各种可以存储的东西,文档开始于根或者文档实体。

  格式良好的XML文档在逻辑上有一个层次树结构,这个树的根节点就是文档实体,文档实体没有名字,只是用来表示根,XML的文档的根元素成为文档元素,它和外部出现的处理指令、注释等作为文档实体的子节点,根元素和它的内部子元素也是一颗树。

  简而言之,XML文档就是一种树型的逻辑结构。


  实体可以包含parsed 和unparsed数据,前者是由一些表示数据与标记的字符组成,parsed entity内容被称为它的替换文本,作为文档整体的一部分,在XML处理程序分析XML文档时,凡是出现引用parsed entity的地方都会被这个实体的内容替换。unparsed entity是一种资源,有一个相关联的用名字标识的notation。前者用实体引用的方法通过名字调用,后者通过entity属性中给出的名字来调用。

  逻辑上,一个XML由声明、元素、注释、字符引用和处理指令组成,所有这些东西都是通过标记来表明,XML标记包括开始标签,结束标签,空元素标签,实体引用,字符引用,注释,CDATA段定界符、文档类型声明,处理指令,XML声明,文本声明以及在文档实体顶层的空白和普通字符组成。


---------------------------------------------------------------------
---------------------------------------------------------------------

XML文档的解析

  通常程序获得xml文档都是通过xml解析器,其模型一般都是程序通过xml解析器提供的api来调用xml解析器。
  所有的解析器都对DOM(Document Object Model)和SAX(Simple API for XML)这两套api提供支持。
  在Java中,有一个叫做JAXP(Java API for XML Processing)的API它只是提供给java程序员一种标准化的形式的XML编程方式。开发者只需要使用JAXP编程,而无须关心底层的解析器。

  DOM的核心概念是节点,使用DOM分析XML文档,它会把XML文档映射成一个对象,这个对象叫做节点。在内存中,这些节点形成一颗文档树。通过操作这个树型对象来获取内容。

  SAX的处理机制有些不同,它是基于事件处理的API,它包括解析器和事件处理器,前者负责读取XML文档,并向事件处理器发送事件,后者负责对事件做出响应,进行处理,这一点我觉得和java的监听器的架构有点类似。

没有评论: