dom4j小结Word文档下载推荐.docx

上传人:b****5 文档编号:16452571 上传时间:2022-11-23 格式:DOCX 页数:27 大小:34.22KB
下载 相关 举报
dom4j小结Word文档下载推荐.docx_第1页
第1页 / 共27页
dom4j小结Word文档下载推荐.docx_第2页
第2页 / 共27页
dom4j小结Word文档下载推荐.docx_第3页
第3页 / 共27页
dom4j小结Word文档下载推荐.docx_第4页
第4页 / 共27页
dom4j小结Word文档下载推荐.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

dom4j小结Word文档下载推荐.docx

《dom4j小结Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《dom4j小结Word文档下载推荐.docx(27页珍藏版)》请在冰豆网上搜索。

dom4j小结Word文档下载推荐.docx

为HTML减肥的呼声越来越高。

为了解决这个问题,以利于Web的健康发展,W3C设计了XML。

XML的设计思想来自于古老的SGML(其实HTML的设计思想也是来自于SGML)。

SGML是IBM创造的一个用于出版业的文档格式标准,后来被ISO采纳作为国际标准(ISO8879)。

SGML把文档内容与文档格式完全分离开,使得内容提供者与排版人员的工作可以相互独立。

SGML是一种非常严谨的标记语言,但是SGML的问题是过于复杂,一个基于SGML的出版系统开发成本高昂,价格不菲,只有象IBM那样的大型企业才有能力购买这样的系统。

SGML过于重量级的特点使其完全不适合用于Web领域。

而且SGML的设计完全是面向文档的,而不是面向数据的,大量基于Web的应用是面向数据的应用。

W3C参考SGML设计了新一代的标记语言XML,XML——可扩展标记语言是一种元语言(我们使用的Eclipse也可以称做是一种元工具),它可以建造其它任意种类的标记语言。

XML实现了W3C最初设定的所有目标,轻量级、易于理解、扩展性好、平台中立、兼顾文档和数据。

实际上XML规范只有几十页,只是SGML规范的1/10左右。

2XML格式

我们来看看XML具体格式:

<

?

xmlversion="

1.0"

encoding="

UTF-8"

>

books>

<

bookshow="

yes"

title>

Dom4jTutorials<

/title>

/book>

LuceneStuding<

no"

LuceneinAction<

owner>

O'

Reilly<

/owner>

/books>

3开发XML应用的3个层次

基于XML的应用从逻辑上分成3个层次,下面是XML文档或数据,中间是XML解析器,上面是XML应用程序。

XML解析器的作用是使用某种XMLAPI读入并解析XML,将XML建造(Build)为内存中的数据结构,便于应用程序处理。

由于XML是基于文本的,具有平台中立性,各种语言都有相应的XML解析器。

4解析XML的API

解析XML的API有几种:

标准的W3CDOM、SAX、Java的JDOM。

标准的W3CDOM就是把整个XML读到内存中形成一棵树状结构,然后用各种方法对这棵数进行遍历、修剪等操作。

因为DOM是W3C的正式标准,所有的语言都有支持DOM的解析器,包括Java、Perl、JavaScript等等。

标准DOM的缺点是XML应用程序在处理XML之前必须把整个XML读进内存,如果XML非常大,例如10M,解析的过程是非常慢的。

所以标准DOM只适合于小型XML的处理。

为了更好地解决大型XML处理的问题,Java开发人员发明了SAX。

SAX的处理方式是这样,为每一个元素、属性、内容(这些都认为是事件)定义一个回调方法,这个回调方法由应用程序提供,解析器以流的方式读入XML,当遇到某个元素、属性、内容时就调用相应的回调方法。

SAX的优点是处理效率高,适合处理大型XML。

缺点是对XML修改起来不方便,实际上SAX2.0以前的版本是不支持对XML的修改的。

而且SAX处理XML中前后相互关联的元素时也没有DOM方便,因为你必须自己保留以前事件的状态信息。

但是SAX还是取得了巨大的成功,后来SAX还被移植到了C++等语言中。

除了SAX,聪明的Java程序员还发明了JDOM,JDOM解决了标准DOM和SAX的问题,可以说是目前最好的XMLAPI。

5XML相关解析器介绍

基于XML的应用程序从逻辑上分成3个层次,下面是XML文档或数据,中间是XML解析器,上面是XML应用程序。

XML解析器的作用是读入XML文档或数据,将XML建造(build)为内存中的数据结构,便于应用程序处理,或者根据XML中包含的信息,调用应用程序提供的回调方法。

处理XML的API有这几种:

DOM、SAX、JAXP、JDOM和DOM4J,这几种是最常用的,还有其它的一些不常用的API。

其中DOM可以用于多种语言,SAX可以用于Java与C++,JAXP、JDOM和DOM4J只能用于Java。

一个XML解析器至少需要实现DOM或SAX两种API中的一种,不过现在常用的JavaXML解析器都同时实现了DOM、SAX和JAXP3种API。

JDOM和DOM4J是由单独的包(jar)来实现的,使用JDOM和DOM4J需要得到标准的XML解析器的支持。

目前在众多的JavaXML解析器中使用最广的是Xerces和Crimson,它们都是开源软件组织Apache软件基金会资助的开源软件。

其中Xerces最初的代码来自IBM的贡献,Crimson最初的代码来自Sun的贡献。

JDK1.4以后的版本中已经包括有XML解析器,因此不再需要另外的XML解析器。

IBMJDK1.4本带的XML解析器是Xerces的早期版本,SunJDK1.4本身带的XML解析器是Crimson的早期版本(孩子总是自家的亲)。

不过即使使用JDK1.4,你仍然可以使用其它的XML解析器。

在我们的开发中全部使用Xerces,主要是因为Xerces在所有JavaXML解析器中功能是最丰富的,根据性能测试Xerces的性能要比Crimson好的多,而且我们在Linux上出于性能的考虑全部使用IBM的JRE/JDK。

5.1DOM简介:

DOM对于XML的处理方式就是把整个XML读到内存中形成一棵树状结构,然后用各种方法对这棵数进行遍历、插入、删除、修剪等操作。

因为DOM是W3C的正式标准,所有的语言都有支持DOM的解析器,包括Java、C/C++、Perl、JavaScript等等。

DOM的优点是信息量丰富(全部都在内存中),而且可以随机访问,尤其是在处理前后相互关联的元素时非常方便。

DOM的缺点是XML应用程序在处理XML之前必须先由XML解析器把整个XML读进内存并生成树状结构,如果XML非常大,例如10M,解析的过程是非常慢的。

如果再加上XSLT转换(这是一种必须要使用DOM的操作)这类同样耗费资源的操作,可能会耗尽系统的内存资源。

所以标准DOM只适合于中小型XML的处理。

5.2SAX简介:

SAX采用事件驱动的方式来处理XML,它的处理方式是:

为每一个元素、属性、内容(这些都认为是事件)定义一个回调方法,这个回调方法由应用程序提供。

解析器以数据流的方式读入XML,当遇到某个元素、属性、内容时就调用相应的回调方法。

缺点是SAX对XML是只读的,不能够对XML进行写操作,而且SAX处理XML中前后相互关联的元素时也没有DOM方便,因为应用程序必须自己保留以前事件的状态信息。

SAX更详细的优缺点可以查看《XML高级编程》第6章的内容,我们这里有这本书的电子版。

5.3JAXP简介:

你们对XML熟悉了以后可能会经常听到JAXP这个词。

JAXP其实不是一个独立的XMLAPI,它的作用是为了解决不同的XML解析器之间的兼容性问题的。

在Sun推出JAXP之前,商业公司(IBM、Oracle、Sun,etc.)、XML专业研究者以及开源软件爱好者开发出来多种多样的XML解析器。

这些解析器有的仅仅实现了DOMAPI,有的同时实现了DOM和SAX。

在我学习XML的过程中,我所知道的JavaXML解析器就有7、8种。

这些不同的XML解析器各有各的特长,它们虽然都遵从W3CDOM或SAX的规范,但是或多或少存在着一些差别,这使得为一种解析器编写的应用程序移植到另一种解析器变得有些困难(也不是非常困难,只是不太方便)。

为了解决这个问题,Sun在DOM、SAX的API之上加了一个抽象层(基本上就是加了一个抽象工厂的设计模式,如果你们对设计模式有所了解的话),这就是JAXP。

JAXP主要采用反射的方式来工作,可以动态加载所使用的XML解析器。

使用JAXP来做XML开发,可以完全忽略不同的XML解析器之间的差别,不需要修改代码就可以更换成另外的XML解析器。

JAXP目前已经得到大多数JavaXML解析器的支持。

除了封装DOM、SAX的那些工厂类外,JAXP还包含用于XSLT转换的API(也是一些工厂类),这些功能在javax.xml.transform这个包里。

5.4JDOM简介:

除了SAX,Java开发人员还发明了JDOM。

虽然名字里有DOM,JDOM其实与DOM毫无关系。

JDOM严格说来其实是一种对象模型,除了处理XML,还可以用于很多其它用途。

JDOM的输入可以有多种格式,输出也可以有多种格式。

这些格式包括XML文件或数据流、Java属性文件、标准DOM树等等。

JDOM利用SAX或DOM(一般是用SAX,极少用DOM)读入XML中的信息后在内存中生成自己的数据结构,就是通过组合(composition)关系嵌套在一起的一系列对象,然后用Java程序员最习惯的面向对象的方式来处理这些数据,处理结束后可以非常方便地输出成各种格式。

和DOM、SAX相比,用JDOM来做XML开发更加容易(代码量更少)。

JDOM的主要的缺点是最初的设计未考虑性能问题,因此性能很差,而且全部使用具体类来实现导致了灵活性较差,但是考虑到易用性和开发效率,JDOM仍然得到了广泛的使用。

5.5DOM4j简介:

由于JDOM本身存在着一些设计缺陷,开发到一半,JDOM的一些开发人员分了出来重新启动了一个开源项目DOM4J。

DOM4J与JDOM所要达到的目标是一样的,即提供一套比DOM、SAX使用更加方便的处理XML的API,同时避免DOM、SAX的主要缺点。

DOM4J重新做了设计,完全基于接口和多态,因此提高了灵活性。

DOM4J在概念上对XML的理解与DOM非常相似,只要你理解了DOM,你就可以轻而易举地理解DOM4J,实际上DOM4J可以看做是一个更好的DOM实现。

而且DOM4J保持了JDOM的易用性,性能上也比JDOM有了非常大的提高。

最值得一提的是DOM4J完全支持XPath,看看DOM4J的这段代码:

Listlist=document.selectNodes(//foo/bar);

Nodenode=document.selectSingleNode(//foo/bar/author);

这与我们前台写的JavaScript是非常相似的,我们学会DOM4J是几乎不需要花什么时间。

DOM4J与JDOM一样,通过SAX或DOM(一般用SAX)读入XML中的信息在内存中生成自己的数据结构,因此DOM4j至少需要一个实现了SAX的XML解析器,我们可以直接使用Xerces。

5.6什么是XPath?

简单地说,XPath就是定位XML中某些节点(元素、属性、内容、处理指令、文档类型定义、注释)的方法。

XPath的目的是为XSLT和XPointer提供一个共同的、整合的语法,用来对应XML的各个部分,选择XML中的某个或某些节点。

XPath是在DOM树中查找节点、做XSLT转换、定义文档内部指针(XPointer)的基础。

有时候也把一个符合XPath规范的表达式称做一个xpath。

我们通常把XPath表达式的结果称为一个节点集(nodeset)。

节点集能够被转换、复制、忽略或执行其它的合法操作。

XPath除了包括定位语法外还包括很多函数定义,这些函数分成4类:

节点集函数、字符串函数、布尔函数和数值函数。

节点集函数,例如position()和count(),通常以节点集作为输入(以XPath表达式的形式),然后做进一步处理。

其它3种类型的函数,例如substring()、not()和round()提供基本的字符串处理、逻辑运算和数值运算的功能。

关于XPath中各种函数定义的详细内容可以参考《XML高级编程》这本书。

所有这些表达式语法或函数定义都是XPath规范或实现的一部分。

由于DOM4J具有易用性、性能、灵活性、功能强大等多方面的优势,今后我们如果需要在服务器端做XML开发,DOM4J将是我们主要采用的工具。

6DOM4J类库及其API使用介绍:

6.1DOM4j使用接口:

DOM4j所有的接口都在org.dom4j这个包里定义:

org.dom4j.Attribute:

Attribute接口定义了XML文件的属性

org.dom4j.Branch:

Branch为能够包含子节点的节点如XML元素和文档定义了一个公共为

org.dom4j.CDATA:

CDATA定义了XMLCDATA区域

org.dom4j.CharacterData:

CharacterData是一个标识接口,标识基于字符的节点。

org.dom4j.Comment:

Comment定义了XML注释的行为

org.dom4j.Document:

Docement接口定义了XML文档

org.dom4j.Element:

Element定义了XML元素

org.dom4j.ElementHandler:

ElementHandler定义了Element对象的处理器

org.dom4j.ElementPath:

被ElementHandler使用,用于取得当前正在处理的路径层次息

org.dom4j.Entity:

Entity定义XMLentity

org.dom4j.Node:

Node为所有的dom4j中XML节点定义了多态行为

org.dom4j.NodeFilter:

NodeFilter定义了在dom4j节点中产生的一个滤镜或谓词的行为

org.dom4j.ProcessingInstruction:

ProcessingInstruction定义XML处理指令

org.dom4j.Text:

Test定义了XML文本节点

org.dom4j.Visitor:

Visitor用于实现Visitor模式

org.dom4j.XPath:

XPath在分析一个字符串后会提供一个XPath表达式

6.2dom4j的主要接口的使用方法:

6.2.1Element

可以通过Element类提供的方法访问一个XML元素中含有的信息:

Method

Comment

getQName()

元素的QName对象

getNamespace()

元素所属的Namespace对象

getNamespacePrefix()

元素所属的Namespace对象的prefix

getNamespaceURI()

元素所属的Namespace对象的URI

getName()

元素的localname

getQualifiedName()

元素的qualifiedname

getText()

元素所含有的text内容,如果内容为空则返回一个空字符串而不是null

getTextTrim()

元素所含有的text内容,其中连续的空格被转化为单个空格,该方法不会返回null

attributeIterator()

元素属性的iterator,其中每个元素都是Attribute对象

attributeValue()

元素的某个指定属性所含的值

elementIterator()

元素的子元素的iterator,其中每个元素都是Element对象

element()

元素的某个指定(qualifiedname或者localname)的子元素

elementText()

元素的某个指定(qualifiedname或者localname)的子元素中的text信息

getParent

元素的父元素

getPath()

元素的XPath表达式,其中父元素的qualifiedname和子元素的qualifiedname之间使用"

/"

分隔

isTextOnly()

是否该元素只含有text或是空元素

isRootElement()

是否该元素是XML树的根节点

要取出Element对象中某个属性的信息,可以调用attributeIterator()方法获得一个Attribute对象的iterator,然后再遍历它。

也可以直接调用attributeValue()方法获得指定属性的值。

该方法接受四种类型的参数:

•attributeValue(QNameqname):

通过指定qualifiedname获得属性值,如果无法找到指定的属性,则返回null。

•attributeValue(QNameqname,StringdefaultValue):

通过指定qualifiedname获得属性值,如果无法找到指定的属性,则返回defaultValue。

•attributeValue(Stringname):

通过指定localname获得属性值,而忽略属性的namespace,如果无法找到指定的属性,则返回null。

•attributeValue(Stringname,StringdefaultValue):

通过指定localname获得属性值,而忽略属性的namespace,如果无法找到指定的属性,则返回defaultValue。

6.2.2Attribute

对于一个Attribute对象,可以使用它的以下方法访问其中的信息:

属性的QName对象

属性所属的Namespace对象

属性所属的Namespace对象的prefix

属性所属的Namespace对象的URI

属性的localname

属性的qualifiedname

getValue()

属性的值

6.2.3DOM4J的具体使用方法介绍:

6.2.3.1创建XML文档

/**

*建立一个XML文档,文档名由输入属性决定

*@paramfilename需建立的文件名

*@return返回操作结果,0表失败,1表成功

*/

publicintcreateXMLFile(Stringfilename){

/**返回操作结果,0表失败,1表成功*/

intreturnValue=0;

/**建立document对象*/

Documentdocument=DocumentHelper.createDocument();

/**建立XML文档的根books*/

ElementbooksElement=document.addElement("

books"

);

/**加入一行注释*/

booksElement.addComment("

威科姆DOM4j例子程序"

/**加入第一个book节点*/

ElementbookElement=booksElement.addElement("

book"

/**加入show属性内容*/

bookEleme

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

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1