版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第四讲:XML 高级技术(1)解析XML文件,内容安排,JAXP DOM概述 解析XML(JAXP DOM) JAXP SAX概述 解析XML(JAXP SAX) JDom解析XML,JAXP,JAXP Java API for XML Processing Sun JDK 1.4的一部分 在包javax.xml.parsers中 特点 使得应用解析和转换XML文档时,API与特定的XML处理器的实现独立 支持SAX和DOM解析APIs,XML处理,SAX 和 DOM 可用于解析和组织XML文档 DOM 在内存中建立一个对应XML文档的树,因此内存消耗大 容易使用,对于交互式应用非常理想 SA
2、X 事件驱动,串行存取 用于服务器端以及高性能应用,DOM :Document Object Model,DOM Document Object Model W3C的一个推荐标准,对应XML文档的一个对象继承标准 XML文档的每个元素、属性都对应DOM树的一个Node DOM API允许通过操纵DOM树中的结点的方式,访问和转换XML文档中的数据,DOM的优缺点,优点 DOM树的强大API 修改数据的结构和抽取数据相对简单 缺点 整个文档被存储在内存中 由于DOM与语言无关,方法的命名不一定严格遵循Java编程的习惯,DOM类继承关系,DOM树,XML实例, Monitor 200 Hard
3、Drive 150 Keyboard 50 ,实例:树型结构,结点种类,Node DOM的基本数据类型,代表文档树中的一个单一结点 Document 代表XML文档,是文档树的根,提供文档数据的基本访问途径,以及文档数据的创建方法 Element 表示XML文档中的一个元素, 可能具有关联的属性或者文本结点 Attr 表示一个ELEMENT对象的属性 Text 表示ELEMENT或者ATTR的文本数据 其他类型:COMMENT, ENTITY,DOM通用方法 (1),Node.getNodeType() 返回节点类型的底层对象,例如:Node.ELEMENT_NODE Node.getNode
4、Name() 对于元素返回其标记名,对于text结点返回字符串#text Node.getFirstChild() 和 Node.getLastChild() 返回给定结点的第一个或者最后一个子结点 Node.getNextSibling() 和 Node.getPreviousSibling() 返回给定结点的下一个和上一个兄弟结点 Node.getAttributes() 返回包含该节点所有属性的集合,前提是当前结点是元素节点 如果该节点非元素节点,返回空,通用DOM方法(2),Node.getNodeValue() 返回该结点的值 对于一个元素结点返回空,因为元素的值是其子节点 对于属性
5、或者text结点返回其值 Node.getChildNodes() 返回包含该结点的所有字结点的集合 Node.getParentNode() 返回该节点的父结点 Element.getAttribute(name) 返回指定属性的值 Element.getTagName() 返回元素名 Element.getElementsByTagName() 根据属性名,返回该元素的所有子孙元素,通用DOM方法(3),Element.setAttribute(name,value) 增加一个新属性,如果同名的属性已经存在,该属性的值将被替换 Attr.getValue() 获取属性值 Attr.getN
6、ame() 获取属性名 Document.getDocumentElement() 获取根元素 Document.createElement(tagName) 创建一个指定类型的元素,Text结点,一个元素(或者属性)的文本,被认为是其子结点而不是其值 获取一个元素结点node的值:node.getFirstChild().getNodeValue();,内容安排,JAXP DOM概述 解析XML(JAXP DOM) JAXP SAX概述 解析XML(JAXP SAX) JDom解析XML,解析XML(JAXP DOM),DOM 解析的过程 创建 JAXP 文档builder 调用解析器,创建
7、一个Document对象,表示该 XML文档 规格化DOM树 获取树的根结点 访问该节点的属性,Step 1: 构建 JAXP Document Builder,首先,获取DOM解析器的工厂实例,然后创建一个解析器对象 DocumentBuilderFactory,解析器类工厂 DocumentBuilder,定义从XML文档中获取DOM文档实例的API,即若干个解析方法 要使用的命名空间敏感及验证有效性,需要使用,Step2: 调用解析器创建文档对象,调用DocumentBuilder的parse方法,提供XML文档的输入流 Document类表示树型结构的解析结果 XML文档可被表示为:
8、URI 输入流 org.xml.sax.InputSource,Step 3: DOM树标准化,标准化的作用 连接跨多行的文本结点 取消空的文本结点,Step 4: 获取文档树的根结点,从根结点开始周游或者修改文档树 一个Element是Node类的子类,表示XML元素 Node表示XML文档的所有不同组件 Document, Element, Attribute, Entity, Text, CDATA, 处理指令, 注释等,Step 5: 访问Node的属性,获取Node的属性 getNodeName,返回元素名 getNodeType,返回结点类型: DOCUMENT_NODE, ELE
9、MENT_NODE等 getAttributes,返回NamedNodeMap,是结点的属性集合 通过getNamedItem获取每个属性 getChildNodes,获取子结点的集合,NodeList 修改文档 setNodeValue,为结点赋文本值 appendChild,追加一个新的子结点 removeChild,删除一个字结点 replaceChild,替换一个节点,内容安排,JAXP DOM概述 解析XML(JAXP DOM) JAXP SAX概述 解析XML(JAXP SAX) JDOM解析XML,Simple API for XML (SAX),事件驱动的XML文档处理 解析器
10、发送事件给程序代码 编程者决定如何响应每个事件 SAX解析器不创建任何对象,而只是传递事件,SAX的优缺点,优点 不需要处理和存储整个文档 (低内存需求) 能够快速跳过无关的部分 快速处理 只需要遍历一次文档 缺点 有限的API 每个元素通过相同的事件句柄来处理 需要跟踪文档位置,并保存临时数据,Java API for XML Parsing (JAXP),JAXP为底层的SAX 1.0/2.0解析器提供了厂家中立的API SAX解析有两个层面的任务: 创建一个内容句柄来处理XML元素 使用内容处理句柄和文档来调用一个解析器,SAX句柄接口,ContentHandler 接收一个文档逻辑内容
11、的通知 (startDocument, startElement, characters等) ErrorHandler 为XML处理错误生成事件 (warning, error, fatalError) 而不是抛出异常 (该决定由编程者决定) DTDHandler 接受DTD相关的基本事件的通知 EntityResolver 处理外部实体,SAX解析步骤,创建解析器实例 创建一个内容句柄来响应解析事件 使用指派的内容句柄和文档来调用解析器,内容安排,JAXP DOM概述 解析XML(JAXP DOM) JAXP SAX概述 解析XML(JAXP SAX) JDOM解析XML,Step 1: 创
12、建解析器实例,SAXParserFactory 创建解析器的一个工厂实例 SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser 定义不同种类的parse()方法,每个方法期望一个XML数据源和一个DefaultHandler对象 SAXParser saxParser = factory.newSAXParser(); saxParser.parse( new File(test.xml), handler);,Step 2: 创建内容句柄,内容句柄响应解析事件 通常,继承DefaultHandler类 pub
13、lic class MyHandler extends DefaultHandler / Event methods . ,DefaultHandler类,org.xml.sax.helpers.DefaultHandler 以空方法实现了所有四个句柄接口 编程人员可继承DefaultHandler,并传递给解析器实例 编程人员可只重载对应一些事件的方法,而忽略其他的方法,基本SAX事件,startDocument 接收文档开始通知 endDocument 接收文档结束通知 startElement 给出标记的名称及其属性 endElement 接收元素的结束通知 Characters 解析器
14、调用该方法获取每个字符数据块,SAX附加事件,ignorableWhitespace 在元素内容中忽略空格 Warning 报告警告,非XML 1.0定义的错误或者严重错误,例如:当一个元素在DTD中定义了两次 Error 当一个XML文档的有效性验证失败时,产生非致命错误 fatalError 一个不可恢复错误,例如:格式错误,文档不可用,SAX事件简单实例,ContentHandler的startElement方法,public void startElement(String nameSpaceURI, String localName, String qualifiedName, At
15、tributes attributes) throws SAXException namespaceUri URI 唯一表示命名空间 localname 不包含前缀的Element名 qualifiedName 完整的元素名,包括前缀 attributes 元素的属性,传递的参数,ContentHandler的characters 方法,public void characters(char chars, int startIndex, int length) throws SAXException chars 构成XML文档的相关字符串 PCDATA 可能导致多次调用characters方法
16、 startIndex 元素的起始位置 length 抽取的字符个数,Step 3: 调用Parse方法,调用parse方法,提供: 内容句柄 XML文档 文件,输入流 saxParser.parse(filename, handler) saxParser.parse( new File(test.xml), handler);,SAX实例1:打印一个XML文档的大纲,定义一个内容句柄 对应XML文档: 开始标记、结束标记和标记体 内容句柄实现,重载下述三个方法: startElement 当发现带有属性列表的开始标记时,打印一个消息 调整打印缩进举例(增加两个空格) endElement
17、缩进举例减小2,打印一个消息表明发现了一个结束标记 characters 打印标记体的第一个单词,PrintHandler,public class PrintHandler extends DefaultHandler private int indentation = 0; /* 遇到开始标记,输出且缩进,增加属性* */ public void startElement(String namespaceUri, String localName, String qualifiedName, Attributes attributes) throws SAXException indent
18、(indentation); System.out.print(Start tag: + qualifiedName); if (attributes.getLength() 0) System.out.print( (); for(int i=0; i0) System.out.print(, ); System.out.print(attributes.getQName(i) + = +attributes.getValue(i); System.out.print(); System.out.println(); indentation = indentation + 2; ,/* 遇到
19、结束标记,打印并减小缩进*/ public void endElement(String namespaceUri, String localName, String qualifiedName) throws SAXException indentation = indentation - 2; indent(indentation); System.out.println(End tag: + qualifiedName); private void indent(int indentation) for(int i=0; iindentation; i+) System.out.prin
20、t( ); /* 打印文本区的首单词 */ public void characters(char chars, int startIndex, int length) String data = new String(chars, startIndex, length); / 空格作为缺省的分割符 StringTokenizer tok = new StringTokenizer(data); if (tok.hasMoreTokens() indent(indentation); System.out.print(tok.nextToken(); if (tok.hasMoreTokens
21、() System.out.println(.); else System.out.println(); ,SAXPrinter,public class SAXPrinter public static void main(String args) String filename = test.xml; printOutline(filename); public static void printOutline (String filename) DefaultHandler handler = new PrintHandler(); SAXParserFactory factory =
22、SAXParserFactory.newInstance(); try SAXParser parser = factory.newSAXParser(); parser.parse(filename, handler); catch(Exception e) String errorMessage = Error parsing + filename + : + e; System.err.println(errorMessage); e.printStackTrace(); ,orders.xml, 1 9.95 Luxury Yachts, Inc. M-1 false . ,Result,Start tag: orders Start tag: order Start tag: count 1 End tag: count Start tag: price 9.95 End tag: price Start tag: yacht Start tag: manufacturer Luxury. End tag: manufacturer Start tag: model M-1 End
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论