XML复习笔记


1、XML概述

1.1 XML的优势与用途

  • 概括:把数据从HTML分离、简化数据共享、简化数据传输、使数据更有用、用于创建新的互联网语言

  • XML 把数据从 HTML 分离
    问题:如果需要在 HTML 文档中显示动态数据,那么每当数据改变时将花费大量的时间来编辑 HTML。
    解决:通过 XML,数据能够存储在独立的 XML 文件中。这样就可以专注于使用 HTML/CSS 进行显示和布局,并确保修改底层数据不再需要对 HTML 进行任何的改变。通过使用几行 JavaScript 代码,您就可以读取一个外部 XML 文件,并更新您的网页的数据内容

  • XML 简化数据共享
    问题:在真实的世界中,计算机系统和数据使用不兼容的格式来存储数据。
    解决:XML 数据以纯文本格式进行存储,因此提供了一种独立于软件和硬件的数据存储方法。
    这让创建不同应用程序可以共享的数据变得更加容易。

  • XML简化数据传输
    问题:对开发人员来说,其中一项最费时的挑战一直是在互联网上的不兼容系统之间交换数据。
    解决:由于可以通过各种不兼容的应用程序来读取数据,以 XML 交换数据降低了这种复杂性。

  • XML 简化平台变更
    问题:升级到新的系统(硬件或软件平台),总是非常费时的。必须转换大量的数据,不兼容的数据经常会丢失。
    解决:XML 数据以文本格式存储。这使得 XML 在不损失数据的情况下,更容易扩展或升级到新的操作系统、新的应用程序或新的浏览器。

  • XML使您的数据更有用
    不同的应用程序都能够访问您的数据,不仅仅在 HTML 页中,也可以从 XML 数据源中进行访问。通过 XML,您的数据可供各种阅读设备使用(掌上计算机、语音设备、新闻阅读器等),还可以供盲人或其他残障人士使用。

  • XML用于创建新的互联网语言
    很多新的互联网语言是通过 XML 创建的。如:
    ① XHTML
    ② 用于描述可用的 Web 服务 的 WSDL
    ③ 作为手持设备的标记语言的 WAP 和 WML
    ④ 用于新闻 feed 的 RSS 语言
    ⑤ 描述资本和本体的 RDF 和 OWL
    ⑥ 用于描述针针对 Web 的多媒体 的 SMIL

1.2 XML与HTML的联系与区别

XML的语法和HTML类似,都以一对相互匹配的起始和结束标记符号来标识信息。但是二者之间功能不同,HTML是用于显示数据信息,而XML的标记则是用于描述数据的性质和结构。

两者的区别如下:

  • HTML将数据和其显示效果混在一起,它是一种表现技术,定义如何显示信息的标签;而XML文档只是存储了数据和描述了数据之间的关系,并没有规定如何显示数据,即将数据和其显示进行了分离。
  • HTML的格式要求比较松散,而HTML解析器通常采用尽量解释的机制,这样容易造成同一个页面在不同的浏览器中可能显示出大不相同的结果。而XMlL是非常严格的标记语言,如:严格区分大小写等问题。
  • HTMl的标记集合是固定的,你不能在自己的应用中扩展HTML标记;而XML没有提供一组事先已经定义好的标签,只是提供了一个标准,可以按照这个标准来定义自己专用的标记,所以XML的标记是可以无限的扩展的,它可以用于描述各种应用领域的数据信息。
  • XML允许粒度更新,不必在XML文档每次有局部改变时都发送整个文档的内容,只有改变的元素才必须从服务器发送到客户机,而HTML却不支持这样的功能。

2、XML语法

2.1 XML文档结构

  • 一个格式规范的XML文档会遵守W3C的XML1.0推荐标准的语法要求,它主要由序言(声明)和主体组成。

  • 序言部分由XML声明、DTD声明、处理指令等构成。

  • 主体部分至少包含一个根元素。

  • 文档包含一个或多个元素

  • 它只有一个包含所有其它元素的元素

  • 元素相互间的嵌套要正确

  • 用在开始和结束标识符中的元素名要精确匹配

  • 属性名不能在同一元素开始标识符中出现多次

  • 属性值必须括在单引号和双引号中

  • 元素内容、属性值中引用的特殊字符,用实体引用替换。

<?xml version="1.0" encoding="gb2312"?>

  
25th December 2010 Me You Happy Christmas
Best Wishes forChristmas Ho Ho Ho
Brought to you by Santa

2.2 XML标记

2.2.1 基本概念

  • XML是基于文本的标记语言,标记(tag)就是XML文档最基本的组成部分。
  • XML标记由用户自行规定。
  • XML标记负责提供和描述一个XML文件或数据包(XML实体)的内容结构。

2.2.2 命名规则

  • 首字符是英文字母、汉字或_,后跟数字和其他字符。
  • 严格区分英文字母的大小写。
  • 不能独立使用数字作为名称。
  • 不能使用 “<”,”>”,”?”,”/”,”&”,”+”,”*”等符号作为标记名。

2.2.3 标记嵌套

  • XML只能有一个称为“根”的元素,其他标记必须写在该根标记内部。
  • 标记可以包含值,也可以为空,也可以包含下一级标记。
  • 某标记的所有子标记,必须写在该标记的起始和结束标记之间。

2.2.4 空标记

  • XML标记分为非空标记和空标记两种类型。
  • 非空标记
<?xml version="1.0" ?>
<员工>
    <姓名>李亮
    <性别>male
    <出生日期>1978.2.5

  • 空标记
  或者 

2.3 XML属性

  • 属性对标记做进一步说明。如HTML中:


   
       金利来
       170/92A
       420.00
   

  • 使用规则
    • 属性必须定义在起始标记内。
    • 属性名的命名规则和元素的命名规则相同,可以由字母、数字、中文及下划线组成,但必须以字母、中文或下划线开头。
    • 属性名区分大小写。
    • 属性值必须使用单引号或双引号。
    • 如果属性值中要使用左尖括号“<”、右尖括号“>”、连接符号“&”、单引号“‘”或双引号“””时,必须使用实体引用。

2.4 实体

  • XML文档可以包含若干个存储单元,这些存储单元叫做实体,由实体名称来标识。
  • 在XML文档中,所有文本都会被解析器解析。但如果在实际运用中,需要在XML文档内引用左尖括号“<”、右尖括号“>”、连接符号“&”、单引号“‘”或双引号“””等特殊符号,可以用XML预定义实体来解决。
  • 一般实体的声明方式

    如:

    引用方法: &实体名;
    如:
    &qhPress;
  • 参数实体的声明方式

    如:

    引用方法: %实体名;
    如:

2.5 CDATA

  • 当XML元素被解析的时候,XML元素内部的文本也会被解析。只有在CDATA段之内的文本会被解析器忽略。CDATA段就是用来包含文本的方法,它通常用于建立代码的脚本。
  • 一个CDATA段以“”标记结束。

2.6 名称空间

  • 名称空间是XML名称的集合。可以用于把元素及其属性限定在特定的名称空间中,以消除元素名称的不确定性。

  • XML命名空间是XML元素解决多义性和名字冲突问题的方案。W3C组织的推荐书对“XML命名空间”(1999年1月14日)的解释:XML命名空间是命名的汇集,它由URI(Uniform Resource Identifier,统一资源标识符)确定,在XML文件中作为元素类型和属性名使用。

  • 声明的语法形式:xmlns:prefix=“uri”

 
   
      金利来
   
   
      李宁
   

3、DTD

3.1 基本概念

  • DTD是Document Type Definition(文档类型定义)的缩写。
  • XML文档是一种描述数据的标记语言,它可以由DTD来定义结构(如文档中的元素、属性等)。
  • 定义了在xml文档中可以包含哪些标记(Tag)、属性(Attribute)、实体(Entities)以及这些内容之间的相互关系。

3.2 元素声明

元素声明:声明XML文档中可出现的元素、元素之间的关系、元素的属性等。
语法形式:

内容说明由以下五种之一组成:
--空元素 EMPTY
--任意 ANY
--字符数据 #PCDATA
--描述子元素的顺序和重复次数的内容模型 Children
--混合型 Mixed

3.3 属性声明

属性声明的语法如下:

例:

对应的XML文档
2010

声明属性时应注意以下几点:

  • 属性名称遵循的规则与有效的元素名称相同。
  • 在一个给定的元素中不能有两个属性同名。
  • 若属性值中含有双引号,则该属性值应用单引号括起来。

属性的默认声明:

  • REQUIRED:必须具有该属性。
    如:
  • IMPLIED:该属性不是必须使用的。
    如:
  • FIXED:将一个属性声明为FIXED之后,在相应XML文档中可以不用明确地指定该属性的值,但如果要明确地指出属性值,该值必须是属性定义时给出的默认值。属性缺省值紧跟在属性类型之后.
    如:

3.4 DTD的引用

  • 内部引用

    ? .......

    ]>

    <?xml version="1.0" standalone="yes"?>
    
    
    
    
    
    
    
    
    ]>
    
    	空元素
    	
    		
    2001年
    webmaster@eastdajia.com
    2001年12月
  • 外部引用

    如果有多个文档要使用同一个DTD,则该DTD可被置于一个单独的文当中(注意DTD文件的文件扩展名为dtd)

    
    
    <?xml version="1.0" standalone="no"?>
    
    
        Michael Calder
        
    44 McMahons Rd Frankston

3.5 XML文档有效性验证

1.分析下列XML实例,编写DTD文档,并进行验证。
<?xml version=”1.0” encoding=”GB2312”>
<学生名册>
 <学生 学号="A">
       <姓名>张三
       <性别>男
       <年龄>20

<学生 学号="A2">
       <姓名>李四
       <性别>女
       <年龄>19

<学生 学号="A3">
       <姓名>王二
       <性别>男
       <年龄>21


2.分析下列DTD文档,上机编写有效的XML文档,并进行验证。














]>

4、Schema

XML Schema(模式或架构)是用于定义XML文档的结构和内容的文档,其作用与DTD文档一样。使用Schema定义XML文档结构,并且以用它来验证XML文档的正确性,用来判断实例是否符合模式中所描述的所有约束。

主要检验如下内容:

  • 验证所有必需的元素和属性是否都存在。
  • 验证元素之间是否正确嵌套,元素是否出现在正确位置。
  • 验证数据的格式是否正确及是否超出值的范围。
  • 为元素和属性添加默认值和固定值。

4.1 Schema与DTD的异同点

Schema和DTD都是验证XML文档结构的技术。

Schema与 DTD相比,Schema具有如下的几个优点:

  • DTD是用一种与 XML不同的语法编写的,而Schema使用的是一种类XML的语言。
  • Schema支持丰富的数据类型。
  • Schema支持命名空间机制。

4.2 W3C XML Schema 数据类型

文档后缀名为.xsd ,其根元素是Schema,其文件结构为:

……

命名空间为
xmlns:xsd="http://www.w3.org/2001/XMLSchema"

例子:

<?xml version="1.0"?>

      
	
		
			
			
			
		
	
       

  • 原子类型:

  • 列表类型:

  • 联合类型:

  • 枚举类型:(外面是xsd:restriction)

    以上都是 包裹

  • 复杂类型:<

    6、XSL

    • XSL(Extensible Stylesheet Language)是可扩展样式表语言,包含3个内容:XSLT,XPath,XSL格式化对象语言(XSL-FO)。

    • 什么是 XSLT?

      • XSLT 指 XSL 转换(XSL Transformations)。
      • XSLT 是 XSL 中最重要的部分。
      • XSLT 可将一种 XML 文档转换为另外一种 XML 文档。
      • XSLT 使用 XPath 在 XML 文档中进行导航。
      • XPath 是一个 W3C 标准。
    • XSL的意义

      • 将文档内容和表示形式分离
      • 在不同的应用之间传输数据
    • XSLT和CSS的比较

      • CSS不能重新排序文档中的元素;
      • CSS不能判断和控制哪个元素被显示,哪个不被显示;
      • CSS不能对文档的内容进行操作

    6.1 XSL模板

    • 模板(template)是XSLT中最重要的概念之一。XSLT文件就是由一个一个的模板组成,任何一个XSLT文件至少包含一个模板。
    • 模板(template)可以有两种应用方式:匹配模式(match pattern)和执行。
    • 匹配模式定义XML源文档中哪一个节点将被模板处理,执行则定义当前节点将被哪个模板处理。两部分对应的语法为xsl:template和xsl:apply-templates。
    元素定义了用于进行转换了的节点内容,其语法如下所示:
    
    
    	
    
    
    • xsl:template的作用是定义一个新模板。
    • 属性中name用来区别匹配同一节点的不同模板。match属性则控制模板的匹配模式(pattern),匹配模式是用来定位XML源文档中哪些节点被模板处理
    <?xml version="1.0" encoding="utf-8"?>
    
    	
    		
    			
    				
    					<xsl:value-of select="title"/>
    				
    			
    			
    				
    			
    		
    	
    	
                 

    6.2 节点的访问

    • 访问单个节点

      元素用于提取单个选定节点的值。
      语法为:

      
          
          
      
      
    • 访问多个节点

      元素可用于选取指定的节点集中的每个 XML 元素。
      它与元素“xsl:apply-templates”是两种不同的方法,但输出结果是相同的。

      
          
              
              
          
      
      

    6.3 节点的输出

    • 元素用于复制当前节点的标记(把标记名也带过去)。
      有两种使用方式:
      文本内容
    • 标记用于复制节点及其属性和子节点。
     显示 xxxx
    
     显示 

    xxxx 显示

    xxxx

    • 元素用于向元素添加属性。
    
      
        
      
    
    

    6.4 节点的选择性输出

    • XSLT规范中允许带条件地处理节点,这一特点类似于编程语言中的“if”语句。

    • 只能用于一个条件的判断,当需要多个条件的判断时,可以使用

      • xsl:if的语法格式为:

      • 
            
                

    • xsl:choose、xsl:when和xsl:otherwise
      xsl:choose元素类似于switch语句执行多条件判断。而xsl:when则是每一个判别,其test属性值就是一个条件表达式。正如switch语句中的default分支,当所有条件都不满足时,则执行的是xsl:otherwise元素;当条件满足时,元素的内容被得到应用。

      
      	
      		< !--样式定义-- >
      	
          
      		< !--样式定义-- >
      	
          
      		< !--样式定义-- >
      	
      	
      		< !--样式定义-- >
      	
      
      

    6.5 XSL使用CSS

    在XSL中使用CSS主要有两种方式:
    1、通过嵌入的HTML标记中使用style属性来设置该标记的样式
    2、把CSS的代码放在之间。

    6.6 XSL主要语句概括

    • xsl:stylesheet 样式表声明
    • xsl:template 定义模板,相当于函数
    • xsl:template match=“” 相当于函数调用,去匹配引号中指定的节点
    • xsl:apply-templates 应用模板
    • xsl:apple-templates select=“” 应用模板于指定节点
    • xsl:for-each select=“” 循环遍历所指的节点
    • xsl:value-of select=“” 取值语句,取出所指定的值

    6.7 XPath

    XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。

    XPath 使用路径表达式在 XML 文档中进行导航
    XPath 包含一个标准函数库
    XPath 是 XSLT 中的主要元素
    XPath 是一个 W3C 标准

    XPath与XSLT以及XPointer一起构成整合的语法,以定位XML文件中各个部分,可选择文件中的元素、属性、文本内容。
    XPath也提供函数以完成基本的数字运算、布尔运算以及字符串处理。
    XPath的核心语法构架是路径表达式

    路径表达式 结果
    /bookstore/book[1] 选取属于 bookstore 的第一个 book 子元素。
    /bookstore/book[last()] 选取属于 bookstore 的最后一个 book子元素。
    /bookstore/book[last()-1] 选取属于 bookstore 的倒数第二个 book子元素。
    /bookstore/book[position()<4] 选取最前面的两个属于 bookstore 的 book子元素。
    //title[@lang] 根据当前上下文,选取所有拥有名为 lang 的属性的 title 元素。
    //title[@lang='eng'] 根据当前上下文,选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
    /bookstore/book[price>35.00] 选取所有 bookstore 元素的 book 元素,且其中的 price 元素的值须大于 35.00。
    /bookstore/* 选取 bookstore 元素的所有子节点
    //* 根据当前上下文,选取当前节点为根的子树里的所有元素
    //title[@*] 根据当前上下文,选取所有带有属性的 title 元素。
    //book/title | //book/price 选取所有 book 元素的 tilte 和 price 子元素。
    //title | //price 根据当前上下文,选取所有的 title 和 price 元素。
    /bookstore/book/title | //price 选取所有属于 bookstore 元素的 book 元素的 title 元素,以及文档中所有的 price 元素。

    7、XLink和XPointer

    • XLink概述
      • XLink定义了一个文档如何链接到另一个文档。
      • 可以在各种平台、应用程序的领域上使用链接。
      • XML对HTML链接功能加以扩展,支持更为复杂的链接。

    7.1.1 简单链接

    • Simple Link的设计目的,就是设计出接近基本HTML的链接功能。其特点就是只有一个链接地址(locator)。
    <?xml version="1.0"?>
    
    	Visit W3School
         
    	
             Visit W3C
         
    
    
    • 在XML文档中使用XLink,必须明确XLink的命名空间:
      xmlns:xlink="http://www.w3.org/1999/xlink"

    7.1.2 XLink属性

    属性 描述
    xlink:actuate onLoad 、onRequest、other 定义何时读取和显示被链接的资源。
    xlink:href URL 要链接的 URL。
    xlink:show embed 、new 、replace 在何处打开链接。replace 是默认值。
    xlink:type simple 、extended 、locator 、arc 、resource 链接的类型
    xlink:role 字符串 向机器描述链接的相关信息
    xlink:title 字符串 向用户描述链接的相关信息
    
    
    

    7.1.4 扩展链接

    • 扩展链接是一个联接任意个数目的资源的链接,资源可能是远程和本地的任何组合。

    • 扩展链接元素:定义了资源之间的关系。

    • 使用值为extended的xlink:type属性来创建扩展链接。

    • extended类型的链接元素可包含下列元素的任意顺序的混合:

      • Locator-类型元素
      • arc-类型元素
      • title-类型元素
      • resource-类型元素
    • 扩展链接定义

    < !ELEMENT xlink:extended 
              (xlink:title*, xlink:arc*, xlink:locator,(xlink:arc | xlink:locator)*,xlink:resource*)>
    < !ATTLIST xlink:extended 
              	role	NMTOKEN	#IMPLIBD
    			title	CDATA	#IMPLIED >
    
    
    • 示例
    <?xml version="1.0" encoding="utf-8"?>
    <书籍 xmlns:xlink= "http://www.w3.org/1999/xlink"
          xlink:type= "extended">
    	<简介 
    		xlink:type= "resource"
    		xlink:href="intro.xml"
     		xlink:role="http://127.0.0.1/xml" 
      		xlink:title= "书籍简介"/>
    	<作者 
    		xlink:type= "locator"
    		xlink:href="http://www.itzcn.net/xml/author/ff.xml"
    		xlink:role="http://www.itzcn.net/xml/"
    		xlink:title= "作者信息"/>
    	<出版社 
    		xlink:type= "locator"
    		xlink:href="http://www.publish-book.net/publish/qh.xml"
    		xlink:role="http://www.publish-book.net/publish/"
    		xlink:title= "出版社信息"/>
    
    

    7.1.5 链接弧

    • 链接弧(arc)用于表示扩展XML链接中资源之间的连接关系,它是扩展XML链接元素的子元素。
    • xlink:type属性值为arc,称之为链接弧元素。
    • 链接弧元素的属性
      • xlink:type:须设置为“arc”
      • xlink:title
      • xlink:arcrole
      • xlink:show
      • xlink:actuate
      • xlink:from:标识“来源”资源
      • xlink:to:标识“目标”资源
    
    
     
    

    7.2 XPointer

    • XPointer的机制用于指向XML文档的内部结构

    • XPointer有以下语法:

      xpointer(expression)

    • XPointer与XLink联合使用:文档或资源由XLink标识,而文档中特定部分由XPointer标识。

    7.2.1 Xlink与XPointer的结合

    • 在外部文档中指定一个XPointer,可使用XLink语法来引用文档,然后后跟(#)和XPointer。
    • 示例:
      http://www.mysite.com/data.xml#xpointer(expression)
    • 通过在xpointer()的括号中放置XPath表达式以创建有效的XPointer:
      示例:
      xpointer(/booklist/book[1])
      本例指向第一个book元素,该元素是根元素booklist的一个子元素。
    • XPointer通过类型ID属性标识元素, 不包含在xpointer()中,而是把它放置在一个#后面。
      示例:
      http://www.mysite.com/books.xml#fiction (fiction是某个元素的id,直接定位获得)

    8、DOM

    8.1 基本概念

    • Document Object Model:文档对象模型

    • DOM是一个与平台无关、与语言无关的应用编程接口

    • DOM是由W3C组织定义并公布的一个规范 (DOM level 1(1998)、2(2000,名称空间\CSS)、3(2004,XPath\键盘事件处理))

    • DOM提供了一个统一的XML数据接口

    • 应用DOM,可以动态创建(XML)文档、遍历文档,添加、修改、删除文档内容

    • DOM接口规范提供了一种面向XML的应用程序开发方法

    8.2 工作原理

    • DOM解析方式,是把整个 XML 文档加载到内存,转化成DOM 树,因此应用程序可以随机的访问 DOM 树的任何数据。
    • 优点:灵活性强,速度快。
    • 缺点:消耗资源比较多。

    8.3 DOM树的结构

    8.4 DOM对象

    • Document对象:即文档对象,文档树的根,是对整个文档进行操作的入口。
    • Element和Attribute对象:这些节点对象都是文档某一部分的映射。
    • Text对象:是Element或Attribute对象的子节点。
    • 集合索引:DOM提供集合索引方式以对节点按指定方式进行遍历,索引参数都是从0开始计数。

    8.5 DOM对文档的操作

    • 通过DOM对XML文档进行管理主要有以下几种操作:
      • 加载XML文档
      • 遍历XML文档
      • 操作控制XML文档节点:
        • 添加操作
        • 删除操作
        • 修改操作
    • DOM加载XML文档
    DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
    DocumentBuilder builder=factory.newDocumentBuilder();
    Document document=builder.parse(new File("Dom_1.xml"));
    Element root=document.getDocumentElement();
    
    • DOM遍历XML文档

      • 对已经加载文档,要从文档中获取所需要内容,就要求能够通过DOM树来访问树中的任何一个节点,这就是对DOM树的遍历。

      • 遍历的基本方式:

        • 根据树结构\节点间的关系
        • 直接获取目标节点
      • 通过以下方法获取XML文档的根元素节点:

        Element root = document.getDocumentElement();

    • 动态创建XML文档

    DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
    DocumentBuilder builder=factory.newDocumentBuilder();
    Document document=builder.newDocument();
    //以下代码通过创建节点、属性、文本值等,在内存中形成DOM树
    //………
    TransformerFactory transFactory=TransformerFactory.newInstance();
    //创建一个TransformerFactory(转换工厂对象)
    Transformer transformer=transFactory.newTransformer();
    //创建一个Transformer对像(文件转换对象)
    DOMSource domSource=new DOMSource(document); 
    //把要转换的Document对象封装到一个DOMSource类中
    File file=new File("火车时刻表.xml");
    FileOutputStream out=new FileOutputStream(file);
    StreamResult xmlResult=new StreamResult(out);
    //将要变换得到XML文件将来保存在StreamResult
    transformer.transform(domSource,xmlResult);//把DOM树转换为XML文件
    
    • 添加元素
    //选择要创建新子节点的节点对象:
    node=doc.selectsingleNode("//A_H_stockinfo")
    //创建新节点:
    newnode=doc.createElement("stockholder")
    //将新节点添加到子元素集合中:
    node.appendChild(newnode)
    //保存修改后的XML文档:
    
    • 修改元素
    NodeList nodeList=root.getElementsByTagName( " NodeName ");
    Element node=(Element)nodeList.item(0);
    node.setTextContent(“文本内容”);
    
    • 删除元素
    //删除元素
    oldNode=node.removeChild(childnode)
    
    //删除属性
    node.removeAttribute(attrname)
    

    9、SAX

    9.1 基本概念

    • SAX是Simple API for XML的缩写。
    • SAX是除了DOM接口之外的另一种 XML编程接口。该接口是以流的方式读取XML文件到内存中,以事件模型的方式解析处理XML文件,获取XML文件里面的信息。
    • 目前SAX的主要使用版本为2.0

    9.2 工作机制

    • SAX是事件驱动的,并不需要一次性读入整个文档在内存中操作,而文档的读入过程也就是SAX的解析过程。所谓事件驱动,是指一种基于回调(callback)机制的程序运行方法。
    • SAX的特点
      • SAX的优点:
        • 不受内存空间的限制
        • 编程简单
        • 处理快速
      • SAX的缺点:
        • 不能对文档做随机存取
        • SAX是只读的
        • 当前的浏览器不支持SAX
    • 例子
    <?xml version="1.0"?>
    
        Professional XML
    
    

    解析器在处理时,将调用一连串方法:

    startDocument ()
    startElement ("books")
    startElement ("book")
    characters("Professional XML")
    endElement ("book")
    endElement ("books")
    endDocument ()
    
    SAXParserFactory saxF = SAXParserFactory.newInstance();
    SAXParser saxParser = saxF.newSAXParser();
    XMLReader xmlReader = saxParser.getXMLReader();
    xmlReader.setContentHandler( new MyHandler() );
    xmlReader.parse( new InputSource( "./src/com/test/test.xml" ) );
    

    9.3 SAX和DOM的异同点

    SAX DOM
    顺序读入XML文件内容并产生相应的事件,适合处理任意大小的XML文件。 需要整体读入XML文件内容以在内存中建立DOM树,不适合处理大型XML文件。
    只能按顺序对XML文档读取一遍,不支持对文件的随机访问。 可以随意存取DOM树的任意部分,不限次数。
    只能读取文档的内容,不能修改 可以任意修改DOM树,从而修改XML文件。
    开发逻辑较为复杂,需要自行编写事件处理器。 易于理解,易于开发。

    9.4 事件响应函数的使用

    • void startDocument()//接收文档开始的通知。
    • void endDocument()//接收文档结束的通知。
    • void startElement(String uri, String localName, String qName, Attributes attributes)//接收元素开始的通知。
    • void endElement(String uri, String localName, String qName)//接收元素结束的通知。
    • void characters(char[] ch, int start, int length)//接收元素中字符数据通知。
    • void processingInstruction(String target, String data) //接收处理指令的通知。
    • void ignorableWhitespace(char[] ch, int start, int length)//接收元素内容中可忽略空白的通知。
    • void setDocumentLocator(Locator locator) //接收文档事件的 Locator 对象。
    • void startPrefixMapping(String prefix, String uri)//接收名称空间映射开始的通知。
    • void EndPrefixMapping(String prefix, String uri)//接收名称空间映射结束的通知。

    9.5 过滤器

    • 基本原理

    • 一个SAX解析器可以拥有多个过滤器对象,不同的过滤器对象有不同的功能。如果一个解析器对象拥有多个过滤器对象,在解析的时候,把这些过滤器在次序上串接起来,XML文件中的事件首先传递给第一个过滤器,处理器把相应的内容做出更改之后,再把事件传递给下一个过滤器。事件经过多次处理之后,最后被传递给解析器的事件处理器。
    package test;
    
    import java.io.IOException;
    
    import org.xml.sax.Attributes;
    import org.xml.sax.InputSource;
    import org.xml.sax.SAXException;
    import org.xml.sax.XMLReader;
    import org.xml.sax.helpers.XMLFilterImpl;
    import org.xml.sax.helpers.XMLReaderFactory;
    
    public class Test1Filter extends XMLFilterImpl {
        private String newURI = null;
        private String oldURI = null;
    
        public Test1Filter( XMLReader reader, String newURI, String oldURI ) {
            super( reader );
            this.newURI = newURI;
            this.oldURI = oldURI;
        }
    
        public void endElement( String uri, String localName, String qName ) throws SAXException {
            // TODO Auto-generated method stub
            if ( uri.equals( this.oldURI ) ) {
                uri = newURI;
            }
            super.endElement( uri, localName, qName );
        }
    
        public void startElement( String uri, String localName, String qName, Attributes attrs ) throws SAXException {
            // TODO Auto-generated method stub
            if ( uri.equals( this.oldURI ) ) {
                uri = newURI;
            }
            super.startElement( uri, localName, qName, attrs );
        }
    
        public void startPrefixMapping( String prefix, String uri ) throws SAXException {
            // TODO Auto-generated method stub
            if ( uri.equals( this.oldURI ) ) {
                uri = newURI;
            }
            super.startPrefixMapping( prefix, uri );
        }
    
        public static void main( String[] args ) {
            try {
                XMLReader reader = XMLReaderFactory.createXMLReader();
                String xmlURI = "D://workplace//test1.xml";
                String oldURI = "http://www.shine.com";
                String newURI = "http://www.yaoyao.com";
                Test1Filter filter = new Test1Filter( reader, newURI, oldURI );
                Test1 test1 = new Test1();
                filter.setContentHandler( test1 );//过滤完后文件交给Test1类解析
                InputSource inputSource = new InputSource( xmlURI );
                filter.parse( inputSource );
            } catch ( SAXException e ) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch ( IOException e ) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    

    10、StAX

    10.1 基本概念

    • StAX是The Streaming API for XML的缩写。
    • StAX与SAX类似,也是一套面向XML流的事件响应式API。
    • StAX采用“Pull”的工作方式,与SAX采用的“Push”工作方式截然不同。

    10.2 工作机制

    • StAX的工作原理:基于事件迭代遍历,允许应用程序通过主动拉取解析事件显式控制XML文件的解析过程,并定制化地对感兴趣的事件进行处理。

    10.3 SAX和StAX的异同点

    StAX SAX
    采用PULL模式,能在一定程度上控制程序的总体逻辑; 采用PUSH模式,程序逻辑由解析器主导;
    支持对XML片段的局部解析(subparsing); 不支持;
    可输出XML文件; 不支持;
    Java中提供的StAX的默认实现暂不支持有效性验证。 支持。

    11、数据岛

    11.1 基本概念

    • 与HTML文档绑定的XML数据源对象简称为DSO(Data Source Object),通常也称为嵌入HTML文档中的XML数据岛。
    • 使用DSO,借助HTML网页来显示XML文档内容,既能保持XML文档数据与其显示格式分离的特点,又具备HTML网页的丰富显示格式。
    • 利用DSO技术显示XML文档的机制是:把链接到HTML网页中的一个XML文档或一段XML数据当作一个类似于数据库的记录集(Recordset)对象,然后使用与数据库类似的操作方法来显示和浏览被链接的XML文档的内容。
    • 采用DSO技术,首先需要进行数据绑定,即将XML文档或数据绑定到HTML文档,然后再将特定的XML元素链接到SPAN或TABLE等标准的HTML元素,这些HTML元素就会自动显示它们所绑定的XML元素内容。

    11.2 数据岛的形式

    • 内嵌的数据岛

      
      <?xml version=“1.0”>
      …
        
      
    • 引用外部的数据岛

      
      
      

    11.3 web页中创建和使用数据岛

    • 与HTML元素的绑定

      • 首先将HTML元素中的DATASRC属性设置为相应的ID,就可以把HTML元素和数据岛联系在一起。然后再通过设置DATAFLD属性值,来确定所提取的XML元素。
      • 支持这种DSO绑定机制的元素如下: A、APPLET、BUTTON、DIV、FRAME、IFRAME、 IMG、INPUT (此处类型是:CHECKBOX、HIDDEN、 LABEL、PASSWORD、RADIO和TEXT)、LABEL、 MARQUEE、SELECT、SPAN、TABLE和 TEXTAREA。
    • 例如,与DIV元素绑定的代码如下:

    11.4 javaScript操纵数据岛中的数据

    • 对子节点的操作
    • DocumentElement.ChildNodes.Item(Index)方法用来访问各个子节点:
      用Tagname属性获取子节点名称;
      用Text属性获取子节点内容。
    <?xml version="1.0" encoding="gb2312"?>
    
        
            Z38
            汉口
            北京西
            20:35
        
        
            Z121
            武昌
            上海
            17:13
        
    
    
    
        
        

    武汉火车站查询系统

    车次:


    起点站:

    终点站:

    发车时间:

    var trainInfo=train.getElementsByTagName("train");
    
    for(var i=0;i

    12、基于XML的数据交换

    12.1 为何需要数据交换

    数据交换是为了满足不同信息系统之间数据资源的共享需要,依据一定的原则,采取相应的技术,实现不同信息系统之间数据资源共享的过程。

    12.2 为何XML适合于数据交换

    使用XML作为传输格式的优势:

    • 格式统一, 符合标准
    • 容易与其他系统进行远程交互, 数据共享比较方便

    12.3 XML向关系数据模型转换的一般方法

    • 基于DTD的映射
      • 对象映射算法:利用对象模型的通用性,采用对象作为中间模式,先将DTD映射到对象模式,再从对象模式映射到关系数据模式。
      • 简单元素类型->对象中的数据成员,类型为String,或数字、日期类型

        映射为
        String name;
      • 注意:以其父元素为类
    • 基于Schema的映射
      • 直接映射算法:根据一定的映射规则,将Schema模式(类型、嵌套关系、约束等)直接映射到关系数据模式(标准SQL语句)。
      • 简单类型simpleType,映射为字段;根据simpleType的具体情况,设置字段的约束。
      • 复杂类型complexType,映射为表;把类型间的包含\嵌套关系,映射为表之间的关系。

    13、XML与JSON

    13.1 JSON的基本语法

    • 6个结构符号: { } [ ] : ,
    • 3个名称记号:true、false、null
    • 值: 对象、数组、字符串、数字、 true、false、null
    • JSON对象:包含在一对花括号{ }里的一组无序的键值对的集合。
    • JSON数组:包含在方括号[ ]里的值的集合;
    {
        "status": 0,
        "message": "成功",
        "size": 2,
        "total": 2,
        "entities": 
        [
            {
                "entity_name": "小王",
                "create_time": "2016-11-01 11:56:32",
                "modify_time": "2016-11-01 13:27:59",
                "latest_location": {
                    "loc_time": 1477978078,
                    "longitude": 116.3189288575,
                    "latitude": 40.04780579193
                },
                "city": "北京",
                "district": "海淀",
                "entity_desc": "小王_01"
            }
        ]
    }
    
    

    13.2 XML与JSON的对比

    XML JSON
    人机可读性
    自描述性
    简洁性
    解析速度
    名称空间支持
    支持有效性验证
    适用领域 数据存储、数据描述、作为元语言 网络数据交换
    • XML适合标记文档,但是 JSON是数据交互的理想格式
      两者最大的不同在于,XML是一个完整的标记语言,而JSON不是。