[信息与通信]DOM.ppt

上传人:音乐台 文档编号:2000538 上传时间:2019-01-30 格式:PPT 页数:45 大小:275.50KB
返回 下载 相关 举报
[信息与通信]DOM.ppt_第1页
第1页 / 共45页
[信息与通信]DOM.ppt_第2页
第2页 / 共45页
[信息与通信]DOM.ppt_第3页
第3页 / 共45页
亲,该文档总共45页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《[信息与通信]DOM.ppt》由会员分享,可在线阅读,更多相关《[信息与通信]DOM.ppt(45页珍藏版)》请在三一文库上搜索。

1、2019/1/30,基于DOM的解析器,2019/1/30,DOM解析器 节点类型 Document节点 Element节点 Text节点 CDATASection节点 Attr节点 DocumentType节点 处理空白 使用DOM生成XML文件 难点: 使用DOM生成XML文件,本章主要内容,2019/1/30,概述,XML解析器是XML和应用程序之间的一个软件组织,为应用程序从XML文件中解析出所需要的数据。 有两种类型的解析器:基于DOM的解析器和基于事件的解析器,本章讲述基于DOM的解析器,和基于事件的解析器(SAX)。,2019/1/30,6.1 初识DOM解析器,DOM(Docu

2、ment Object Model,文档对象模型)是W3C制定的一套规范标准,各种语言可以按着DOM规范给出解析XML文件的解析器。Sun公司发布的JDK1.4的后续版本中提供了解析XML文件的API(Java API for XML Parsing,JAXP)。,2019/1/30,DOM是什么?,Document Object Model:文档对象模型 DOM是由W3C组织定义并公布的一个规范 DOM是一个与平台无关、与语言无关的应用程序接口,2019/1/30,DOM的作用,DOM提供了一个统一的XML数据接口; 应用DOM,可以动态创建(XML)文档、遍历文档,添加、修改、删除文档内容

3、; DOM接口规范提供了另一种编写XML代码的方法。,2019/1/30,DOM在应用程序开发中所处地位,2019/1/30,是各种应用程序用于在 XML 文档中修改和检索元素或内容的应用程序编程接口(API)。 基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树) 应用程序通过对这个DOM树的操作,实现对XML文档数据的操作。 通过DOM接口,应用程序可以在任何时候访问XML文档中的任何一部分数据, 这种利用DOM接口的机制也被称作随机访问机制。,2019/1/30,DOM的结构,DOM把文档表示为节点(Node)对象树 节点对象表示文档中XML元素,也代表文档

4、内其他所有内容: 根元素,处理指令,注释文档类型,实体,实体引用,命名空间等多种对象模型 DOM用对象把具体的XML文档模型化: 不仅描述文档的结构,还定义对象的行为,2019/1/30,DOM表示文档,由DOM创建的节点树是XML文件内容的逻辑表示; DOM树展示了XML文件提供的信息以及它们之间的关系。,XML文件清单: Mobile Game v1.5 ,2019/1/30,加载XML文档后的DOM树,2019/1/30, 张三 李四 ,2019/1/30,sex,male,sex,male,DOM树状结构,2019/1/30,DOM接口,在DOM接口规范中,有4个基本接口: Doc

5、ument:是对文档进行操作的入口,本节点是DOM树中的根节点。 Node:代表DOM树中的一个节点 。 NodeList:表示有顺序关系的一组节点。 NamedNodeMap:用于属性节点的表示。,2019/1/30,Document接口,Document接口是整棵文档树的根,提供对文档中的数据进行访问和操作的入口。 Document接口提供了创建其他节点对象的方法。 由于元素、文本节点、注释、处理指令等都不能脱离文档的上下文关系而独立存在,所以在Document接口提供了创建其他节点对象的方法,通过该方法创建的节点对象都有一个ownerDocument属性,用来表明当前节点是由谁所创建的以

6、及节点同Document之间的联系。,2019/1/30,Document接口同其他接口之间的关系,Document,Document.doctype,Document.documentElement,可分别 包含多 个处理 指令节 点及注 释节点,只能有一个文档 类型节点、一个 根节点,2019/1/30,Node接口,Node:DOM接口中很大部分接口是从Node接口继承来的; Element、Attr、CDATASection等接口,都是从Node继承过来的 Node接口代表了树中的一个节点; Node接口提供了访问DOM树中元素内容与信息的途径。,2019/1/30,典型的Node接口

7、,2019/1/30,NodeList接口提供了对节点集合的抽象定义 它并不包含如何实现这个节点集的定义。 NodeList用于表示有顺序关系的一组节点,比如某个节点的子节点序列。 还出现在一些方法的返回值中,例如GetNodeByName。,NodeList接口,2019/1/30,NodeList接口,对文档的改变,会直接反映到相关的NodeList对象中。 如果通过DOM获得一个NodeList对象,该对象中包含了某个Element节点的所有子节点的集合,当再通过DOM对Element节点进行操作(添加、删除、改动节点中的子节点)时,这些改变将会自动地反映到NodeList对象中,而不需

8、DOM应用程序再做其他额外的操作。 NodeList中的每个item都可以通过一个索引来访问,该索引值从0开始。,2019/1/30,包含了可以通过名字来访问的一组节点的集合。 NamedNodeMap并不是从NodeList继承过来的,它所包含的节点集中的节点是无序的。 NamedNodeMap表示的是一组节点和其唯一名字的一一对应关系,这个接口主要用在属性节点的表示上,NamedNodeMap接口,2019/1/30,NamedNodeMap表示的是一组节点和其唯一名字的一一对应关系,这个接口主要用在属性节点的表示上。 与NodeList相同,在DOM中,NamedNodeMap对象也是“

9、live“的。,2019/1/30,DOM四个基本的接口,四个基本的接口:Document,Node,NodeList以及NamedNodeMap。 Document接口是对文档进行操作的入口,它是从Node接口继承过来的。 Node接口是其他大多数接口的祖先,象Document,Element,Attribute,Text,Comment等接口都是从Node接口继承过来的。 NodeList接口是一个节点的集合,它包含了某个节点中的所有子节点。 NamedNodeMap接口也是一个节点的集合,可以建立节点名和节点之间的一一映射关系,从而利用节点名可以直接访问特定的节点。,2019/1/30,

10、DOM接口,DOM树所提供的随机访问方式给应用程序的开发带来了很大的灵活性,它可以任意地控制整个XML文档中的内容 由于DOM分析器把整个XML文档转化成DOM树放在了内存中,因此,当文档比较大或者结构比较复杂时,对内存的需求就比较高。 对于结构复杂的树的遍历也是一项耗时的操作。 所以,DOM分析器对机器性能的要求比较高,实现效率不十分理想。 由于DOM分析器所采用的树结构的思想与XML文档的结构相吻合, 同时鉴于随机访问所带来的方便 DOM分析器还是有很广泛的使用价值的。,2019/1/30,6.1.1 创建DOM解析器的步骤,在JAXP(Java API for XML Parsing,J

11、AXP)中,DOM解析器是DocumentBuilder类的一个实例,该实例由DocumentBuilderFactory负责创建。步骤有3步。 1.使用javax.xml.parsers包中的DocumentBuilderFactory类调用其类方法newInstance()实例化一个DocumentBuilderFactory对象 DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); 2.factory对象调用newDocumentBuilder()方法返回一个DocumentBuilder对象(Docum

12、entBuilder类在javax.xml.parsers包中) domParser(称做DOM解析器),例如: DocumentBuilder domParser=factory.newDocumentBuilder(); 3.domParser对象调用public Document parse(File f)方法解析参数f指定的XML文件,该方法返回的对象是实现了Document接口的一个实例(Document接口在org.w3c.dom包中),例如: Document document=domParser.parse(new File(“student.xml“) ;,2019/1/30

13、,6.1.1 创建DOM解析器的步骤,DOM解析器在内存中建立和XML文件相对应的树形结构数据。 应用程序只要分析内存中的树形结构数据,就可以获得XML文件中的各种数据了。,2019/1/30,6.1.2 Doucument对象的结构,在步骤3中,DOM解析器负责在内存中建立Document对象,即调用parse方法返回一个实现Document接口的对象,简称Document对象。也称Document对象为Document节点。 应用程序可以从Document节点的子孙节点中获取整个XML文件中数据的细节。 Document节点是“树”的根节点,该“树”由实现了Node接口的类的实例所组成,X

14、ML文件中的标记都和Document节点的某个Node子节点相对应。 例题6-1 p117,2019/1/30,6.1.2 example6_1.xml文件对应的Document节点,2019/1/30,6.2.1 Node接口,6.2 节点的类型,Doucumen接口也是Node接口的子接口,也就是说,parse方法将整个被解析的XML文件封装成一个节点返回(XML文件和内存中的Document节点相对应),并且该节点和它的子节点组成树形结构数据。因此,应用程序可以从Document节点的子孙节点中获取整个XML文件中数据的细节。,2019/1/30,XML文档组成和DOM结点类型、结点名称

15、、结点值的对应关系,2019/1/30,6.2.2 Node 接口的常用方法,short getNodeType() 该方法返回一个表示节点类型的常量(Node接口规定的常量值),例如,对于Element节点,getNodeType()方法返回的值为 Node.ELEMENT_NODE NodeList getChildNodes() 返回一个由当前节点的所有子节点组成的NodeList对象。 Node getFirstChild() 返回当前节点的第一个子节点。 Node getLastChild() 返回当前节点的最后一个子节点。 NodeList getTextContent() 返回当

16、前节点及所有子孙节点中的文本内容。,2019/1/30,6.2.3 节点的子孙关系,为了解析规范的XML文件,DOM规范规定了各种类型节点之间可以形成的子孙关系,比如,Document节点有且仅有一个Element节点,也可以有一个DocumentType节点(规范的XML文件有且仅有一个根标记,也可以有一个与其关联的DTD文件),Element节点可以有Element子节点和Text子节点(规范的XML文件中的标记可以有子标记和文本)。,2019/1/30,6.2.4使用递归方法输出节点中的数据,节点调用getNodeType()方法返回一个表示节点类型的常量(Node接口规定的常量值),因

17、此我们可以通过判断节点的类型来输出和节点相关的数据,比如当节点类型的Element节点时,就输出节点的名字,当节点是Text节点时就输出节点中的数据等。 例题6-2 p120,2019/1/30,6.3 Document节点,解析器的parse方法将整个被解析的XML文件封装成一个Document节点返回,应用程序可以从该节点的子孙节点中获取整个XML文件中数据的细节。 Document节点的两个直接子节点的类型分别是DocumentType类型和Element类型,其中的DocumentType节点对应着XML文件所关联的DTD文件,通过进一步获取该节点子孙节点来分析DTDL文件中的数据;而

18、其中的Element类型节点对应着XML文件的根节点,通过进一步获取该Element类型节点子孙节点来分析XML文件中的数据。,2019/1/30,6.4 Element节点,Element节点是Document节点的最重要的子孙节点,因为被解析的XML文件的标记对应着这样类型的节点。 表示Element节点的常量是Node.ELEMENT_NODE,一个节点用short getNodeType()方法返回的值如果等于Node.ELEMENT_NODE,那么该节点就是Element节点。 Element节点经常使用下列方法获取和该节点相关的信 String getTagName() Strin

19、g getAttribute(String name) NodeList getElementsByTagName(String name) NodeList getElementsByTagNameNS(String namespaceURI,String localName) 。 boolean hasAttribute(String name) boolean hasAttributeNS(String namespaceURI, String localName) 例题6-3 p122,2019/1/30,6.5 Text节点,规范的XML文件的非空标记可以有子标记和文本内容。在DOM

20、规范中,解析器使用Element节点封装标记,用Text节点封装标记的文本内容,即Element节点可以有Element子节点和Text节点。 表示Text节点的常量是Node.TEXT_NODE,一个节点调用 short getNodeType()方法返回的值如果等于Node.TEXT_NODE,那么该节点就是Text节点。 Text节点使用String getWholeText()方法获取节点中的文本(包括其中的空白字符)。 例题6-4 p124, 例题6-5 p125,2019/1/30,6.6 Attr节点,在XML文件中,属性并不是标记的子标记,因此,在DOM规范中,Att节点也不是

21、Element节点的子节点。如果想解析XML文件中标记的属性,必须让对应的Element节点调用调用 NamedNodeMap getAttributes()方法。 该方法返回的NamedNodeMap对象由有节点组成,这些节点可以被转换为Attr节点。 Attr节点通过调用String getName()方法返回属性的名字、调用String getValue()方法返回属性的值。 例题6-6 p127,2019/1/30,6.7 DocumentType节点,DocumentType节点是Document节点的一个子节点。 DocumentType节点对应着XML文件所关联的DTD文件,通过

22、进一步获取该节点子孙节点来分析DTD文件中的数据。Document节点调用getDoctype() 返回当前节点的DocumentType子节点。 例题6-7 p128,2019/1/30,6.8 处理空白,标记之间的缩进区域是为了使得XML文件看起来更美观很形成的,但解析器并不知道这一点,所以解析器仍然认为它们是有用的文本数据(由空白类字符组成,如:tnx0Bfr)。 如果想让DOM解析器忽略缩进空白,即这些缩进空白不在Document中形成Text节点,那么XML文件必须是有效的,而且所关联的DTD文件必须规定XML文件的标记不能有混合内容,同时DocumentBuilderFactory

23、对象在给出DOM解析器之前,必须调用 setIgnoringElementContentWhitespace(boolean whitespace)进行设置,将参数whitespace的的取值为true。 例题6-8 p130,2019/1/30,6.9 验证规范性和有效性,JAXP(Java API for XML Parsing)提供的解析器默认地检查XML文件是否是规范的,并不检查XML文件是否是有效的,也就是说,DOM解析器调用parse()方法时,如果XML文件是规范的,parse()方法就返回一个实现了Document接口的对象,否则将显示XML文件中不符合规范的错误信息。 即使X

24、ML文件关联了一个DTD,解析器也并不检查XML文件是否是有效的,即不检查XML文件是否遵守该DTD规定的限制条件。如果想要检查一个XML文件是否有效,必须让DocumentBuilderFactory对象factory事先设置是否检查XML文件的有效性.如: factory.setValidating(true);,2019/1/30,6.10 使用DOM生成XML文件,2019/1/30,我们可以对Document节点进行修改,然后使用Transformer对象将一个Document节点变换为一个XML文件(Transformer类在javax.xml.transform包中),需要经过如

25、下步骤: 1.使用javax.xml.transform包中的TransformerFactory类建立一个对象: TransformerFactory transFactory=TransformerFactory.newInstance(); 2.使用步骤1中得到的transFactory对象调用newTransformer()方法得到一个Transformer对象:Transformer transformer=transFactory.newTransformer(); 3.将被变换的Document对象封装到一个DOMSource对象中(DOMSource类在javax.xml.tr

26、ansform.dom包中): DOMSource domSource=new DOMSource(document);,6.10.1 Transformer对象,2019/1/30,4.将变换要得到XML文件对象封装到一个StreamResult对象中(StreamResult类在javax.xml.transform.stream包中): File file=new File(“newXML.xml“); FileOutputStream out=new FileOutputStream(file); StreamResult xmlResult=new StreamResult(out)

27、; 5.最后Transformer 对象transformer 调用transform方法实施变换 transformer.transform(domSource,xmlResult);,6.10.1 Transformer对象,2019/1/30,6.10.2 用于修改Document的常用方法,Node接口是Document的父接口,提供了许多用来修改、增加和删除节点的方法: Node appendChild(Node newChild) Node removeChild(Node oldChild) throws DOMException Node replaceChild(Node n

28、ewChild, Node oldChild) Attr removeAttributeNode(Attr oldAttr) void setAttribute(String name, String value) Text replaceWholeText(String content) void appendData(String arg) void insertData(int offset, String arg) void deleteData(int offset,int count) void replaceData(int offset,int count, String arg),2019/1/30,6.10.3 用DOM建立XML文件,例题6-9 p133, 例题6-10 p135,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1