第七章解析器和DOM.ppt_第1页
第七章解析器和DOM.ppt_第2页
第七章解析器和DOM.ppt_第3页
第七章解析器和DOM.ppt_第4页
第七章解析器和DOM.ppt_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第七章 解析器和DOM,本章将学习以下内容: XML解析器; 应用程序与解析器如何交互; 文档对象模型(Document Object Model); 利用DOM编写JavaScript应用程序; 利用DOM编写Java程序; 使用DOM的其她应用程序;,XSL是一种声明式的语言,功能很强大; 但实际中,有很多领域XSL方法没办法处理。 需要借助“程序”(过程化的语言)的力量! 本章介绍两个可替换的、而且是标准的方法,这两种方法 都是老式的API(Application Programming Interface) 一、Document Object Model(文档对象模型),DOM 二、S

2、imple API for XML (适用于XML的简单API) ,SAX 两种方法的区别: DOM是基于对象的接口,以程序为主; SAX是基于事件的接口,以XML为主;,什么时候使用DOM或SAX来代替XSLT? XSL不能胜任的关键之处在于对文本数据的控制。 XSL主要强调了对整个文本字符串的操作,如,是否在 字符串中搜索一个匹配字符串,以及是否需要执行某种 替换操作。,XSL不能胜任之处: 如果需要对文本元素的子字符串进行操作; 当转换指向第三方系统时; 如将XML文档从美国英语翻译为英国英语时。 在一个目录中搜索某作者所著的全部书名; ,一、XML解析器,XML程序的结构,XML程序由

3、两部分组成: 解析器:用于处理XML文档; 应用程序:通过解析器对文件内容进行操作;,XML 文档,解析器,应用程序,编程接口,基于对象的API,基于事件的API,一、XML解析器,解析器Parser,解析器是一段可以读入一个文档并分析其结构的代码。 解析器是用来读取和解释源代码的模块。 解析器可以使程序员摆脱XML语法的细节。,如何使用一个解析器Parser,通常,使用一个解析器需要如下步骤: 创建一个解析器对象; 将XML文档传递给解析器; 处理结果;,显然构建一个XML应用远远超出了这些,但一个XML 应用将包含这些流程。,一、XML解析器,验证解析器和非验证解析器,非验证解析器 对文档

4、执行语法规则的检查,但不进行 (Non-Validating Parser) 合法性验证。 验证解析器 对文档进行语法检查,并且通过DTD或 (Validating Parser) Schema对文档进行合法性验证,解析器的种类(有不同的方法来划分解析器的种类) 验证和非验证解析器; 支持DOM的解析器; 支持SAX的解析器; 特定语言编写的解析器(Java,C+,Perl等) ;,一、XML解析器,为什么使用非验证解析器?,速度和效率 一个XML解析器处理DTD并确保每个XML的元素符合在 DTD中的规则需要相当大的开销。 如果你确定一个XML文档是有效的(可能来自一个数据源), 那就没必要

5、再次验证它了。 同样,有时你所需要的只是从一个文档中找出XML的标记, 然后依据标记,将数据从文档中提取出并加以处理,这样 的处理一个非验证解析器就足够了。,一、XML解析器,基于对象的接口(DOM),基于对象的接口,解析器使用一个语法分析程序将XML文档翻译成内存中的对象树,以表示每一种属性和元素。 然后就可以使用这些对象接口中的方法来浏览整个文档,抽取信息,或者将文档转换成自己所需要的内容。 如果需要,可以将内存中的对象结构在转换成为XML.,应用程序可以很方便的操作内存中的树,而不必去理会 XML的语法。 DOM是W3C的的正式推荐标准,,一、XML解析器,基于事件的接口,基于事件的接口

6、不构建对象树,它读入文件,并在从文件中 找到元素、属性或文本的时候,生成相应的事件。 事件:元素开始、元素结束、属性、文本内容、实体等。 应用程序要监听事件,并对事件做出判断。,二、DOM,一个DOM应用程序,Example HTML中包含JavaScript编写的应用程序conversion-ie5.html 以上代码中: 定义了一个表单,它含有一个字段用于填入汇率; Rate: 定义了一个只读的多行文本框,用于输出结果; 定义了一个XML数据岛(XML island); XML数据岛是微软对HTML做出的专有扩展,开发者可 以在HTML文档中插入XML文档。,基于对象的接口(DOM),DO

7、M中的关键类是Node,Document,Element,NodeList,Attr。 Node代表结构中的一个节点。这里所指的节点可以是文档 的任何一个部分; Document代表整个文档,整个文档也可以被视为一个节点, 也即Document类是由Node派生而来的; Element表示任何XML元素; 同样这个类也是由Node派生来的。 Node类包含了一个称为childNodes的属性,这个属性的类型 是NodeList。 Attr代表一个元素的属性; DOM中包含了大量的其他类,以上这五个是最基础的。,二、DOM,DOM节点,二、DOM,Node属性(用来帮助完成对DOM树的遍历):

8、nodeType 对象类型的代码表示; parentNode 当前Node对象的父节点; childNodes 当前Node对象的子节点列表,它是NodeList类型; firstChild Node对象的第一个子节点 lastChild Node对象的最后一个子节点; previousSibling 紧邻当前节点的前驱Node对象; nextSibling 紧邻当前节点的后继Node对象; attributes 属性列表(若当前Node对象具有属性) 以下为操作下层对象的属性: nodename Node的名称(若有名称空间前缀,也将包含在其中); localName/baseName 名称

9、中的本地部分; namespaceURI 名称空间的URI; prefix 名称空间前缀; nodeValue Node的值;,二、DOM,DOM节点,nodeType代码,二、DOM,DOM节点,Example function searchPrice(node,output,rate) if(node.nodeType=1) /with DOM level 2, it would be node.localName if(node.baseName=“product” ,二、DOM,DOM节点,NodeList 是一个包含Node列表的DOM对象。 NodeList有两个属性: lengt

10、h 列表中的节点数; item(i) 访问列表中的第i个节点的方法;,NamedNodeMap 是一个具有名称的节点列表,支持NodeList的属性和方法。 除了length和item(i)外,它还支持以下方法: getNamedItem()/getNamedItemNS()/getQualifiedItem() 根据输入节点的名称返回相应的节点; setNamedItem()/setNamedItemNS() 根据给定的节点名称设置节点; removeNamedItem()/removeNamedItemNS() 根据给定的节点名称,删掉相应的节点;,二、DOM,DOM节点,Document

11、对象 Document是DOM树中最顶层的元素,由Node派生而来, 增加了3种属性: documentElement 从文档得到根节点; implementation 定义了不需要文档参与的方法; doctype 文档类型定义;,Element对象 Element除继承了Node的属性外,还定义了一些属性和方法: tagName属性 标记名称; getElementByTagName()/getElementByTagNamesNS() 根据给定的标记名称返回含有该元素的所有后代的一个 NodeList; getAttributeNode()/getAttributeNodeNS() 根据给

12、定的标记返回一个属性节点;,二、DOM,DOM节点,Attr对象 属性对象Attr,除继承了Node的属性之外,还定义了 下列属性: name 属性名称; value 属性值; ownerElement 具有属性的元素; specified 若属性在文档中被赋值,则它的值为true, 若属性使用DTD中的默认值,则它的值为false;,二、DOM,DOM节点,Text对象 表示文本。 Example function getText(node) var children=node.childNodes, text=“”; for (i=0;ichildren.length;i+) var n=

13、children.item(i); if(n.nodeType=3) text += n.data; ,二、DOM,遍历源树 Example function searchPrice(node,output,rate) if(node.nodeType = 1) if(node.baseName = product ,二、DOM,解析器是一个软件应用程序,设计用于分析文档,以及做一些特定于该信息的事情。 在SAX这样基于事件的API中,解析器将向某种监听器 发送事件。 在DOM基于树的API中,解析器将在内存中构造一棵节 点树。,二、DOM,XML文档具有一个称为节点的信息单元层次结构; DO

14、M是描述那些节点和节点间关系的方式。,实际的DOM推荐标准是一个API,它定义了XML文档中出现的对象,以及用于访问和处理这些对象的方法和属性。,学习使用DOM Core API作为读取和处理XML数据。,需要安装的工具: 文本编辑器; JavaTM 2 SDK,Standard Edition 1.4x版;DOM支持已内置到最新版本的Java技术中。(Apache Xerces-Java或SUN Java API for XML) 其他语言 C+,Perl等;,二、DOM,作为API的DOM,DOM Level 1 DOM API 包含了一些接口,用于表示可从 XML文档中找到的所有不同类型

15、的信息。它还包含使用这 些对象所必需的方法和属性。 DOM Level 2添加了名称空间(XML Namespace)支持。 Level 2 扩展了Level 1,还增加了几个新的模块,以支持级 联样式表、事件和增强的树操作。 DOM Level 3包括对创建 Document 对象(以前的版本将这 个任务留给实现,使得创建通用应用程序很困难)的更好 支持、增强的名称空间支持,以及用来处理文档加载和保 存、验证以及XPath的新模块; DOM的模块化意味着作为开发人员,您必须知道自己希望使用的特性是否受正在使用的DOM实现所支持。,二、DOM,DOM解析器的选择,根据应用程序的需要选择DOM或

16、SAX; 基本上每种解析器都支持这两种实现方法。 编程语言的选择; 解析器支持多种语言Java,C+,Perl,Python Java: IBM的XML4J www.alphaW James Clark的XP SUN的Crimson C+: IBM的XML4C www.alphaW James Clark的expat Mircosoft的MSXML4.0 Perl: Python: /topics/xml,二、DOM,DOM解析器的选择,JDK1.4以上内置了对DOM和SAX的实现, 使用的解析器是SUN的crimson。 Apache的Xerces2.6.2 需要

17、在classpath中加xercesImpl.jar, xml-apis.jar这两个包。 在JDK中的改动: 在JRElib目录下建立perties的文件,来替换解析器。 perties的内容如下: javax.xml.parsers.DocumentBuilderFactory= org.apache.xerces.jaxp.DocumentBuilderFactoryImpl javax.xml.parsers.SAXParserFactory= org.apache.xerces.jaxp.SAXParserFactoryImpl 重启,二、DOM,DO

18、M文档是以层次结构组织的节点或信息片断的集合。 这个层次结构允许开发人员在树中寻找特定信息。 DOM提供的API,允许开发人员添加、编辑、移动或删除树中任意位置的节点,从而创建一个引用程序。 分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。,二、DOM,DOM解析过程,二、DOM,基本的XML文档,XML文档的基本组成部分: XML声明; DCOTYPE声明 /Schema声明; 数据本身;,Example XML文档 d:javaorders.xml,右图是对XML文档元 素的精确描述,但不是对DOM所标示数据的

19、精确描述。,二、DOM,元素和节点的区别,元素节点是信息的容器。该信息可能是其他元素节点、文本节点、属性节点或其他类型的信息。,注意:节点数目,二、DOM,XML中最常见的节点类型包括: 元素:元素是XML的基本构造模块。 通常,元素拥有子元素、文本节点,或两者的组合。 元素节点也是能够拥有属性的唯一节点类型。 属性:属性节点包含关于元素节点的信息,但是并不实际认 为是元素的孩子,比如在下面的例子中: 12341 文本:文本节点就是文本。 它可以由更多信息组成,也可以只包含空白。 文档:文档节点是文档中其他所有节点的父亲。,二、DOM,不太常见的节点类型,CDATA节:包含不应该被解析器分析的

20、信息。 它包含的信息应该以纯文本传递。 Important:Please keep head and 注释:注释包括关于数据的信息,通常被应用程序忽略。 处理指令:处理指令是专门针对应用程序的信息, 文档片断:格式良好的文档必须仅有一个根元素。 有时在使用XML的时候,必须临时创建多组元素, 如下面的文档片断: 825.00 49.00 ,二、DOM,DOM是用来描叙XML文档中的数据的模型,引入DOM的全部原因就是为了用这个模型来操作XML文档的中的数据。DOM规范中定义有节点(即对象)、属性和方法,我们通过这些节点的存取来存取XML的数据。,大体上操作XML文档可以分为三个步骤: 创建XM

21、L解释器; 通过XML解释器和XML文件建立关联; 通过XML解释器解释XML标记;,三、Java and DOM,通过DOM读取XML文档的内容遵循以下步骤: 通过DocumentBulderFoctory创建XML解释器; 通过解释器创建一个可以加载并生成XML的DocumentBuilder; 通过DocumentBuilder加载并生成一颗XML树。Document对象的实例; 通过Document可以遍历这颗树。并读取相应节点中的内容. 关于解释器的加载,以及生成器的加载都是放在 import javax.xml.parsers包中。 该包中处了DOM以外还包括SAX解释器和生成器。

22、,Example d:javaXmlDisplay.java,三、Java and DOM,JAXP(Java API for XML Processing),JAXP1.1 2001年发布,JAXP使用DOM,SAX,XSLT等标准技术, 使应用程序可以很容易的处理XML文档。 JAXP1.1支持SAX2.0和DOM level 2。 在JAXP中定义了创建解析器对象(其它部分与转换XML文档有关),javax.xml.parsers包中定义了4个类: DocumentBuilderFactory:创建DOM解析器工厂的API; DocumentBuilder:定义了从DOM解析器中获得 D

23、OM Document对象的方法; SAXParserFactory:创建SAX解析器工厂的API; SAXParser:包装SAX XMLReader类的API; 当XMLReader读取文件时,生成SAX事件。,三、Java and DOM,JAXP(Java API for XML Processing),JAXP是一个统一的接口,它本身不做任何解析的事情。 它让其它的XML API都来遵循JAXP,那么用JAXP写出来的 程序,底层的API(解析器)可以任意切换。 javax.xml.parsers包用来寻找符合DOM标准的XML API实现 类的位置。 JAXP应用程序有如下的层次:

24、 JAXP应用程序 JAXP接口 Xerces DOM实现 Xerces DOM/SAX解析器,(Crimson实现),三、Java and DOM,JAXP如何选择解析器,工厂类首先根据java命令行传入的参数进行寻找;D:javajava _Djavax.xml.parsers.DocumentBuilderFactory = org.apache.xerces.jaxp.DocumentBuilderFactoryImpl_JAXPChecker_file:/D:/java/books.xml 然后根据JREperties中定义的实现类寻找; 如果找不到,JAXP在

25、META-INF/services/javax.xml.parsers.DocumentBuilderFactory中找DocumentBuilderFactory; 最后找不到,JAXP会用默认的解析器Crimson;,三、Java and DOM,JAXP(Java API for XML Processing),使用JAXP标准创建解析器,import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.SAXParser;

26、 import org.w3c.dom.*; import java.io.*; public class OrderProcessor . DocumentBuilderFactory factory= DocumentBuilderFactory.newInstance(); DocumentBuilder db= factory.newDocumentBuilder(); Document doc=db.parse(filename);,/throws FactoryConfigurationError /parser setting,such as factory.setValidat

27、ing(),/throws ParserConfigutationException,/throws SAXException, java.io.IOException /parse file and create Document,Example firstJAXPChecker.java,三、Java and DOM,解析器设置 .xercesdocsjavadocsapi,Java的DOM Level 2实现允许通过以下方法控制解析器的参数: setCoalescing():决定解析器是否要将 CDATA 节点转换为文 本,以及是否要和周围的文本节点合并(如果适用的话)。 其默认值为 f

28、alse。 setExpandEntityReferences():确定是否要展开外部实体引用。 如果为 true,外部数据将插入文档。其默认值为 true。 setIgnoringComments():确定是否要忽略文件中的注释。 其默认值为 false。 setIgnoringElementContentWhitespace():确定是否要忽略元素内 容中的空白(类似于浏览器对待 HTML的方式)。 其默认值为 false。 setNamespaceAware():确定解析器是否要注意名称空间信息。 其默认值为 false。 setValidating():默认情况下,解析器不验证文档。

29、将这个参数设置为 true 可打开验证功能。,三、Java and DOM,解析器功能测试,在DOMImplementation中可以使用hasFeature来测试是否 有某个功能。,Example d:javafirstXercesModuleChecker.java,二、DOM,DOM节点,nodeType 每一个节点 类型由一个 常数量来定义,类型:short,二、DOM,non-tree nodes,TTTRIBUTE_NODE:attach an element,but not child of element ENTITY_NODE: NOTATION_NODE: FRAGMENT_NODE:only uesed when building DOM tree in memory,not when reading them from a parsed file,document type node properties

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论