JAVATM与XML 2010-05-14
一、概念
l 任何XML文档对任何类型的应用以及正确的解析都必须具有良好的结构well-formed
l XML文档可以是有效地(valid),但并非一定要求有效。
l PI(processing instruction)格式:<?target instructions?>。XML中的处理指令只能是解析器可以识别的XML标准处理命令集中的一部分
l DTD(Document Type Definition),为一个XML文档(或一个文档集合)监理了一套规则。DTD本身不是独立的技术规范,它属于规范的一部分,XML文档中的文档类型声明既可以是标记约束,也可以是带有标记约束的外部文档。这两种约束的综合就是DTD
l namespace(名字空间)就是一个元素前缀与URI(统一资源标识符)之间的一种映射关系
l XSL(Extensible Stylesheet Language)可扩展样式表语言。能够改变及转换一种XML格式的XML数据,使其变为另一种XML格式。
l XSLT(Extensible Stylesheet Language Transformation,可扩展样式表语言转换)过程中,一个XSL文本样式表和一个XML文本文档被“合并到一块”,这将导致XML数据按照XSL类型而被格式化。
l XPath(XML Path Language,XML路径语言)是一个独立的技术规范,但它为XSLT大量使用。XPath技术规范定义了一个XML文档的特定条目该如何定位。
l XML模式(Schema)是被设计用来代替和增强DTD的。
l XQL是被设计用来允许XML文档格式轻松地描述数据库查询的一种查询语言。
l SAX是XML简单API(Simple API for XML)的缩写。提供了一个用来解析XML数据的基于事件的框架,它是扫描整个文档,并将数据拆解成几个游泳部门的一种处理过程。SAX是提供和解析XML数据的一种方法。SAX为解析器提供了一个可用的框架,而且定义了解析过程中用于监视的事件。SAX API为文档解析提供的是方法,而不是XML解析器本身。
l DOM(Document Object Model),相比之下,SAX只是在一个XML文档范围内位数据提供通路,DOM则提供了操作此类数据的一种方式。DOM还将整个XML文档读入内存,并将所有的数据储存在节点中,是整个文档可以快速使用。这也是DOM的缺陷,占用大量的内存,文档越庞大,缺陷越明显。
l Java是可移植的代码,XML是可移植的数据。
l XML最流行的用法是创建内容与表现形式的分离,此时我们将应用程序的内容(content)定义为需要为客户方显示的数据,将应用程序的表述(presentation)定义为该数据的格式
l XML-RPC、B2B、XSP等
二、分析XML结构
<?xml version="1.0" standalone=”no”?>
<?xml-stylesheet href="XSL/JavaXML.html.xsl" type="text/xsl"?>
<?xml-stylesheet href="XSL/JavaXML.wml.xsl" type="text/xsl" media="wap"?>
<?cocoon-process type="xslt"?>
<!DOCTYPE JavaXML:Book SYSTEM "DTD/JavaXML.dtd">
<!-- Java and XML -->
<JavaXML:Book xmlns:JavaXML="http://www.oreilly.com/catalog/javaxml/">
<JavaXML:Title>Java and XML</JavaXML:Title>
<JavaXML:Contents>
<JavaXML:Chapter focus="XML">
<JavaXML:Heading>Introduction</JavaXML:Heading>
<JavaXML:Topic subSections="7">What Is It?</JavaXML:Topic>
<JavaXML:Topic subSections="3">How Do I Use It?</JavaXML:Topic>
<JavaXML:Topic subSections="4">Why Should I Use It?</JavaXML:Topic>
<JavaXML:Topic subSections="0">What's Next</JavaXML:Topic>
</JavaXML:Chapter>
<JavaXML:Chapter focus="XML">
<JavaXML:Heading>Creating XML</JavaXML:Heading>
<JavaXML:Topic subSections="0">An XML Document</JavaXML:Topic>
<JavaXML:Topic subSections="2">The Header</JavaXML:Topic>
<JavaXML:Topic subSections="6">The Content</JavaXML:Topic>
<JavaXML:Topic subSections="1">What's Next?</JavaXML:Topic>
</JavaXML:Chapter>
<JavaXML:Chapter focus="Java">
<JavaXML:Heading>Parsing XML</JavaXML:Heading>
<JavaXML:Topic subSections="3">Getting Prepared</JavaXML:Topic>
<JavaXML:Topic subSections="3">SAX Readers</JavaXML:Topic>
<JavaXML:Topic subSections="9">Content Handlers</JavaXML:Topic>
<JavaXML:Topic subSections="4">Error Handlers</JavaXML:Topic>
<JavaXML:Topic subSections="0">A Better Way to Load aParser</JavaXML:Topic>
<JavaXML:Topic subSections="4">"Gotcha!"</JavaXML:Topic>
<JavaXML:Topic subSections="0">What's Next?</JavaXML:Topic>
</JavaXML:Chapter>
<JavaXML:SectionBreak/>
<JavaXML:Chapter focus="Java">
<JavaXML:Heading>Web Publishing Frameworks</JavaXML:Heading>
<JavaXML:Topic subSections="4">Selecting a Framework</JavaXML:Topic>
<JavaXML:Topic subSections="4">Installation</JavaXML:Topic>
<JavaXML:Topic subSections="3">Using a Publishing Framework</JavaXML:Topic>
<JavaXML:Topic subSections="2">XSP</JavaXML:Topic>
<JavaXML:Topic subSections="3">Cocoon 2.0 and Beyond</JavaXML:Topic>
<JavaXML:Topic subSections="0">What's Next?</JavaXML:Topic>
</JavaXML:Chapter>
</JavaXML:Contents>
<JavaXML:Copyright>&OReillyCopyright;</JavaXML:Copyright>
</JavaXML:Book>
l header和content:首部给出XML解析器和XML应用程序信息,指明了处理文档的方式;内容是XML数据本身。
l 任何XML文档中首先看到的声明就是XML指令,XML指令实际上是PI的一个特定子集。指令并不一定是一对“关键字=值”。通常以xml-[name]开头的PI指定的是[name]中所给出的与XML相关的技术
<?xml-stylesheet href="XSL/JavaXML.html.xsl" type="text/xsl"?>
<?xml-stylesheet href="XSL/JavaXML.wml.xsl" type="text/xsl" media="wap"?>
指令中给出的是一个XSL样式表,这条指令被传给XSLT引擎而不是XML解析器。第一个参照的是一个缺省的样式表(定位和类型已被指定了),第二个指定了另一种样式表,并给出了媒体属性,当发布引擎请求的媒体与指定类型相匹配,所替代的样式表就是用了。
l 初始化XML指令指令后通常是一个DOCTYPE声明。这个声明有独一无二的句法、一个特定的目的:为XML文档指定一个DTD
<!DOCTYPE JavaXML:Book SYSTEM "DTD/JavaXML.dtd">
DOCTYPE的第一个参数是文档的根元素。第二个参数是SYSTEM或者PUBLIC。该参数是由URI来标识的
l 内容包含了所有的元素、属性和包含在这些结构中的文本化数据。
l 根元素是XML文档中最高级别的元素。,在文档中必须是第一个打开最后一个关闭的标签。提供了一个XML解析器或XML应用程序能够识别出XML文档的开始和结束的参考点。
l 名字空间规范要求用一个唯一的URI与前缀联系起来,以把这个名字空间中的元素与其他名字空间中的元素区别开。推荐采用URL如本例。(难以理解)
l 元素是由任意名字描述的,并且必须包含在一对尖括号中。
<!-- Standard element opening tag -->
<JavaXML:Contents>
<!-- Standard element with attribute -->
<JavaXML:Chapter focus="XML">
<!-- Element with textual data -->
<JavaXML:Heading>Web Publishing Frameworks</JavaXML:Heading>
<!-- Empty element -->
<JavaXML:SectionBreak/>
<!-- Standard element closing tag -->
</JavaXML:Contents>
创建元素的第一规则是,名字必须以一个字母、数字、下划线、连字符和句点开始。不能内嵌空格。大小写敏感。用良好命名方式定义自我文档时非常必要的。每一个被打开的元素都必须依次关闭。良构文档并不一定是有效的(valid),还要看它是否符合它的DTD或者模式设定的约束集合。空元素使用<chapterIncomplete/>或<img src=”/imges/xml.gif”/>
l 元素属性:元素属性和他们的值可以在打开声明中,也可以在关闭声明中。
n <JavaXML:Chapter focus="Java"> 其中focus可取值为Java或XML
n 属性名必须放在一对引号之中(单双引号都可以),普遍都是用双引号,引号中的引号也可以成为属性值的一部分()使用时慎重
n 何时使用属性:用元素来描述有规律的数据,用属性来描述系统数据
n 实体引用(entity reference)是XML中的一种特殊的数据类型,用于饮用另外一些数据段。格式为:&[entity name];
n 当大量字符要实体引用进行转换,或者当空格必须要保留下来时,要用CDATA项标记