XML第9,10讲-JAVA的XML编程

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

JAXP使用步骤2
DocumentBuilder db = dbf.newDocumentBuilder(); 当获得一个工厂对象后,使用它的静态 方法newDocumentBuilder()方法可以获得 一个DocumentBuilder对象,这个对象代 表了具体的DOM解析器。 下面就可以利用这个解析器来对XML文 档进行解析了

4使用指定的ContentHandler,解析给 XML文件 xmlReader.parse(new File(filename),new SAXCounter());


ContentHandler实际上是一个接口,当 处理特定的XML文件的时候,就需要为其 创建一个实现了ContentHandler的类来 处理特定的事件
SAX
在XMLReader接受XML文档,在读入XML文档的 过程中就进行解析,也就是说读入文档的过程 和解析的过程是同时进行的,这和DOM区别很 大。 解析开始之前,需要向XMLReader注册一个 ContentHandler,也就是相当于一个事件监听 器,在ContentHandler中定义了很多方法,比 如startDocument(),它定制了当在解析过程 中,遇到文档开始时应该处理的事情。当 XMLReader读到合适的内容,就会抛出相应的 事件,并把这个事件的处理权代理给 ContentHandler,调用其相应的方法进行响应。

Java的XML解释器-JAXP
JAXP API--嵌入不同的解释器 : Java API for XML Processing SAX解释器+DOM解释器+XSL转换器 javax.xml.parsers中加载XML文档的类:

– – – –
DocumentBuilder DocumentBuildrFactory SAXParser SAXParserFactory

1 SAXParserFactory spf = SAXParserFactory.newInstance(); 通过一个SAXParserFactory类来创建具体的 SAXParser对象,这样,当需要使用不同的解 析器的时候,要改变的,只是一个环境变量的 值,而程序的代码可以保持不变。这就是 FactoryMethod模式的思想

SAX API SAX的XML解释器:Apache的Xerces或 Crimson 处理XML文档的接口: ContentHandler EntityResolver ErroHandler DTDHandler DeclHandler LexicalHandler

DOM API 节点 Node-节点类型接口层次结构的根。 Document-树结构的根 Element-XML元素 Text-元素内的文本 Attr-元素的特性 CDATA Sectionn-CDATA NodeList-子节点的集合 ProcessingInstruction-指令 Comment-包含注释的信息 DocumentFragment-Document的消减版,用于 在树中移动节点 DocumentType-文档类型定义的子集。 Entity-DTD中的实体标记 EntityReference-XML文档中的实体引用 Notation-DTD中的符号标记

JDOM
Jason Hunter 和 Brett McLaughlin 创立的 一种简单 Java API http://www.jdom.org JDOM的目的是成为Java特定文档模型, 它简化与XML的交互并且比使用DOM实 现更快。

JDOM仅使用具体类而不使用接口 JDOM文档声明其目的是“使用20%(或 更少)的精力解决80%(或更多)Java/XML 问题” JDOM包括对程序行为的相当广泛检查以 防止用户做任何在XML中无意义的事

DOM
DOM是用与平台和语言无关的方式表示 XML文档的官方W3C标准。 DOM是以层次结构组织的节点或信息片 断的集合。这个层次结构允许开发人员 在树中寻找特定信息。分析该结构通常 需要加载整个文档和构造层次结构,然 后才能做任何工作。


由于它是基于信息层次的,因而DOM被 认为是基于树或基于对象的。DOM以及 广义的基于树的处理具有几个优点。首 先,由于树在内存中是持久的,因此可 以修改它以便应用程序能对数据和结构 作出更改。它还可以在任何时候在树中 上下导航,而不是像SAX那样是一次性 的处理。DOM使用起来也要简单得多。
SAX
这种处理的优点类似于流媒体的优点: 分析能够立即开始,而不是等待所有的数据被 处理。 由于应用程序只是在读取数据时检查数据,因 此不需要将数据存储在内存中。这对于大型文 档来说是个巨大的优点。 事实上,应用程序甚至不必解析整个文档;它 可以在某个条件得到满足时停止解析。一般来 说,SAX还比它的替代者DOM快许多

SAX是只读的. DOM可以从XML原文件中读取文档, 也可以创建和修改内存中的文档。 – 相比较而言,SAX是用来读取XML文 档而不是书写文档。
XML的解析技术

1 DOM,Level 2
2 Simple APwenku.baidu.com for XML (SAX), Version 2.0
3 JDOM

使用 DOM、SAX 或 JDOM 处理 XML 文 档的内容。 如果使用 DOM 或 SAX,则使用 JAXP 创建解析器。 如果使用 JDOM,则 JDOM 库为您创建 解析器。

2 创建一个解析器SAXParser对象 saxParser = spf.newSAXParser();

3得到SAXParser中封装的SAX XMLReader xmlReader = saxParser.getXMLReader();

SAXParser是JAXP中对XMLReader的一个封装类, 而XMLReader是定义在SAX2.0种的一个用来解 析文档的接口。 可以同样的调用SAXParser或者XMLReader中的 parser()方法来解析文档,效果是完全一样的。 在SAXParser中的parser()方法接受更多的参 数,可以对不同的XML文档数据源进行解析, 因而使用起来要比XMLReader要方便一些。
JAXP使用步骤1

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 目的是为了创建与具体解析器无关的程 序,当DocumentBuilderFactory类的静态 方法newInstance()被调用时,它根据一个 系统变量来决定具体使用哪一个解析器。
Java的XML编程
XML的解析编程技术
读取XML文档的方式

1 作为文件读取方式:
– 把X M L只当做一个文件读取.然后自己挑选出其中
的标签。
– 你可能不能够正确地处理所有的特殊情况,
这样你的程序会接收到一个非常规范的X M L文档,却不能正确地处理它。 要避免这种想法:

XML解析器(大多数是免费的)。



void startDocument():
当遇到文档的开头的时候,调用这个方 法,可以在其中做一些预处理的工作 void endDocument():


和上面的方法相对应,当文档结束的时 候,调用这个方法
void startElement(java.lang.String namespaceURI, java.lang.String localName, java.lang.String qName, Attributes atts) void endElement(java.lang.String namespaceURI, java.lang.String localName, java.lang.String qName)
void characters(char[] ch, int start, int length): 用来处理在XML文件中读到字符串,它的参数 是一个字符数组,以及读到的这个字符串在这 个数组中的起始位置和长度,我们可以很容易 的用String类的一个构造方法来获得这个字符 串的String类:String charEncontered=new String(ch,start,length)。

JAXP使用步骤3
Document doc = db.parse("c:/xml/message.xml"); parse()方法接受一个XML文档名作为输 入参数,返回一个Document对象,这个 Document对象就代表了一个XML文档的 树模型。


以后所有的对XML文档的操作,都与解 析器无关,直接在这个Document对象上 进行操作就可以了。而具体对Document 操作的方法,就是由DOM所定义的了。
2 DOM

用解析器分析文档并在内存里创建对文档 内容树状的表达方式:解析器将输出传递 给文档对象模型,即DOM。 这样程序可以从树的顶部开始遍历,按照 从一个树单元到另一个单元的引用,从而 找到需要的信息。
– 3 SAX – 事件驱动接口:
– 可以用解析器读取文档,当解析器发
现标签时告知程序它发现的标签。 例如它会告知它何时发现了一个开始 标签,何时发现了一些特征数据,以 及何时发现了一个结束标签。 因为解析器告知应用程序它遇到的有 含义的事件。
相关文档
最新文档