仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 562|回复: 11
打印 上一主题 下一主题

[学习教程] JAVA网页编程之Java 处置 XML 的三种支流手艺及先容仓酷云

[复制链接]
小妖女 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:29:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
Java的桌面程序开发在java程序员里通常叫swing开发,主要用的swing包里的类开发的,也就是通常说的c/s架构开发简介:XML(eXtensibleMarkupLanguage)意为可扩大标志言语,它已是软件开辟行业中年夜多半程序员和厂商用以选择作为数据传输的载体。本文作者关于Java处置XML的几种支流手艺举行一些总结和先容,但愿匡助那些有分歧需求的开辟职员关于XML处置手艺的作出最优的选择。
最后,XML言语仅仅是企图用来作为HTML言语的替换品而呈现的,可是跟着该言语的不休开展和完美,人们愈来愈发明它所具有的长处:比方标志言语可扩大,严厉的语律例定,可以使用成心义的标志,内容存储和体现分别等等上风必定了该言语从出生之日起就会走向光辉。XML言语在成为W3C尺度以后进进到了一个疾速开展的时代,固然它自己所具有的一系列长处和上风也必定了各年夜手艺厂商对它的偏幸,Java作为软件行业的一种开辟手艺也敏捷作出了反响,呈现了多种对XML撑持的工具,本文将会从这个角度对Java处置XML的几种支流手艺举行先容,但愿能对您有所匡助。在这篇文章中,您将会失掉以下信息:
1、Java供应了哪些优异的类库及工具便于程序员对XML举行处置?
2、有了DOM了,别的工具类库另有需要么?
3、几个小例程带你疾速懂得这三种剖析体例
Java有哪些优异的类库及工具便于程序员对XML举行处置?
●赫赫有名的DOM
●绿色环保的SAX
●冷静无闻的Digester
XML三种剖析体例简介
赫赫有名的DOM
说它赫赫有名但是一点不为过,DOM是W3C处置XML的尺度API,它是很多别的与XML处置相干的尺度的基本,不但是Java,别的诸如Javascript,PHP,MS.NET等等言语都完成了该尺度,成了使用最为普遍的XML处置体例。固然,为了能供应更多加倍壮大的功效,Java关于DOM间接扩大工具类有良多,好比良多Java程序员耳熟能详的JDOM,DOM4J等等,它们基础上属于对DOM接口功效的扩大,保存了良多DOMAPI的特征,很多底本的DOM程序员乃至都没有任何停滞就纯熟把握了别的二者的利用,直不雅、易于操纵的体例使它深受宽大Java程序员的喜好。
绿色环保的SAX
SAX的应运而生有它特别的必要,为何说它绿色环保呢,这是由于SAX利用了起码的体系资本和最疾速的剖析体例对XML处置供应了撑持。但随之而来烦琐的查找体例也给宽大程序员带来很多困扰,经常使人头痛不已,同时它对XPath查询功效的撑持,使人们对它又爱又恨。
冷静无闻的Digester:XML的JavaBean化
Digester是apache基金构造下的一个开源项目,笔者对它的懂得源于对Struts框架的研讨,是不是有良多程序员想要一解各年夜开源框架的计划乃至想要本人写一个功效壮大的框架时会碰着如许一个困难:这些五花八门的用XML言语标志的框架设置文件,框架底层是用甚么手艺来剖析呢?DOM剖析泯灭工夫,SAX剖析又过于烦琐,何况每次剖析体系开支也会过年夜,因而,人人想到必要用与XML布局绝对应的JavaBean来装载这些信息,由此Digester应运而生。它的呈现为XML转换为JavaBean对象的需求带来了便利的操纵接口,使得更多的相似需求失掉了对照完善的
办理办法,不再必要程序员本人完成此类烦琐的剖析程序了。与此同时SUN也推出了XML和JavaBean转换工具类JAXB,有乐趣的读者能够自行懂得。
三种剖析体例对照
DOM
优弱点:完成W3C尺度,有多种编程言语撑持这类剖析体例,而且这类办法自己操纵上复杂快速,非常易于初学者把握。其处置体例是将XML全部作为相似树布局的体例读进内存中以便操纵及剖析,因而撑持使用程序对XML数据的内容和布局举行修正,可是同时因为其必要在处置入手下手时将全部XML文件读进到内存中往举行剖析,因而其在剖析年夜数据量的XML文件时会碰到相似于内存保守和程序溃散的风险,请对这点多加注重。
合用局限:小型XML文件剖析、必要全剖析大概年夜部分化析XML、必要修正XML树内容以天生本人的对象模子
SAX
SAX从基本上办理了DOM在剖析XML文档时发生的占用大批资本的成绩。实在现是经由过程相似于流剖析的手艺,通读全部XML文档树,经由过程事务处置器来呼应程序员关于XML数据剖析的需求。因为其不必要将全部XML文档读进内存傍边,它对体系资本的节俭是非常不言而喻的,它在一些必要处置年夜型XML文档和功能请求较高的场所有起了非常主要的感化。撑持XPath查询的SAX使得开辟职员加倍天真,处置起XML来加倍的轻车熟路。可是同时,其仍旧有一些不敷的地方也困扰宽大的开辟职员:起首是它非常庞大的API接口使人望而却步,其次因为其是属于相似流剖析的文件扫描体例,因而不撑持使用程序关于XML树内容布局等的修正,大概会有方便的地方。
合用局限:年夜型XML文件剖析、只必要部分化析大概只想获得部分XML树内容、有XPath查询需求、有本人天生特定XML树对象模子的需求
Digester/JAXB
优弱点:因为其是在上述二者的基本上衍生出来的工具类,为的是满意将XML转换为JavaBean的特别需求,故而没有甚么出格分明的优弱点。作为赫赫有名的开源框架Struts的XML剖析工具Digester,为我们带来了将XML转换为JavaBean的牢靠办法。
合用局限:有将XML文档间接转换为JavaBean需求。
使用示例
上面给出一段用于剖析的XML片断:
清单1.XML片断
1234567891011<?xmlversion="1.0"encoding="UTF-8"?><books><bookid="001"><title>HarryPotter</title><author>JK.Rowling</author></book><bookid="002"><title>LearningXML</title><author>ErikT.Ray</author></book></books>DOM剖析XML
Java中的DOM接口简介:JDK中的DOMAPI遵守W3CDOM标准,个中org.w3c.dom包供应了Document、DocumentType、Node、
NodeList、Element等接口,这些接口均是会见DOM文档所必需的。我们能够使用这些接口创立、遍历、修正DOM文档。
javax.xml.parsers包中的DoumentBuilder和DocumentBuilderFactory用于剖析XML文档天生对应的DOMDocument对象。
javax.xml.transform.dom和javax.xml.transform.stream包中DOMSource类和StreamSource类,用于将更新后的DOM文档写进XML文件。
上面给出一个使用DOM剖析XML的例子:
清单2.DOM剖析XML

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455importjava.io.File;importjava.io.IOException;importjavax.xml.parsers.DocumentBuilder;importjavax.xml.parsers.DocumentBuilderFactory;importjavax.xml.parsers.ParserConfigurationException;importorg.w3c.dom.Document;importorg.w3c.dom.Element;importorg.w3c.dom.Node;importorg.w3c.dom.NodeList;importorg.xml.sax.SAXException;publicclassDOMParser{DocumentBuilderFactorybuilderFactory=DocumentBuilderFactory.newInstance();//LoadandparseXMLfileintoDOMpublicDocumentparse(StringfilePath){Documentdocument=null;try{//DOMparserinstanceDocumentBuilderbuilder=builderFactory.newDocumentBuilder();//parseanXMLfileintoaDOMtreedocument=builder.parse(newFile(filePath));}catch(ParserConfigurationExceptione){e.printStackTrace();}catch(SAXExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}returndocument;}publicstaticvoidmain(String[]args){DOMParserparser=newDOMParser();Documentdocument=parser.parse("books.xml");//getrootelementElementrootElement=document.getDocumentElement();//traversechildelementsNodeListnodes=rootElement.getChildNodes();for(inti=0;i<nodes.getLength();i++){Nodenode=nodes.item(i);if(node.getNodeType()==Node.ELEMENT_NODE){Elementchild=(Element)node;//processchildelement}}NodeListnodeList=rootElement.getElementsByTagName("book");if(nodeList!=null){for(inti=0;i<nodeList.getLength();i++){Elementelement=(Element)nodeList.item(i);Stringid=element.getAttribute("id");}}}}
在下面的例子中,DOMParser的Parse()办法卖力剖析XML文件并天生对应的DOMDocument对象。个中DocumentBuilderFactory用于天生DOM文档剖析器以便剖析XML文档。在猎取了XML文件对应的Document对象以后,我们能够挪用一系列的API便利的对文档对象模子中的元素举行会见和处置。必要注重的是挪用Element对象的getChildNodes()办法时将前往其下一切的子节点,个中包含空缺节点,因而必要在处置子Element之前对节点范例加以判别。
能够看出DOM剖析XML易于开辟,只必要经由过程剖析器创建起XML对应的DOM树型布局后即可以便利的利用API对节点举行会见和处置,撑持节点的删除和修正等。可是DOM剖析XML文件时会将全部XML文件的内容剖析成树型布局寄存在内存中,因而不合适用DOM剖析很年夜的XML文件。
SAX剖析XML
与DOM创建树形布局的体例分歧,SAX接纳事务模子来剖析XML文档,是剖析XML文档的一种更疾速、更轻量的办法。使用SAX能够对XML文档举行有选择的剖析和会见,而不用像DOM那样加载全部文档,因而它对内存的请求较低。但SAX对XML文档的剖析为一次性读取,不创立任何文档对象,很难同时会见文档中的多处数据。
上面是一个SAX剖析XML的例子:
清单3.SAX剖析XML

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364importorg.xml.sax.Attributes;importorg.xml.sax.SAXException;importorg.xml.sax.XMLReader;importorg.xml.sax.helpers.DefaultHandler;importorg.xml.sax.helpers.XMLReaderFactory;publicclassSAXParser{classBookHandlerextendsDefaultHandler{privateListnameList;privatebooleantitle=false;publicListgetNameList(){returnnameList;}//CalledatstartofanXMLdocument@OverridepublicvoidstartDocument()throwsSAXException{System.out.println("Startparsingdocument...");nameList=newArrayList();}//CalledatendofanXMLdocument@OverridepublicvoidendDocument()throwsSAXException{System.out.println("End");}/***Startprocessingofanelement.*@paramnamespaceURINamespaceURI*@paramlocalNameThelocalname,withoutprefix*@paramqNameThequalifiedname,withprefix*@paramattsTheattributesoftheelement*/@OverridepublicvoidstartElement(Stringuri,StringlocalName,StringqName,Attributesatts)throwsSAXException{//Usingqualifiednamebecausewearenotusingxmlnsprefixeshere.if(qName.equals("title")){title=true;}}@OverridepublicvoidendElement(StringnamespaceURI,StringlocalName,StringqName)throwsSAXException{//Endofprocessingcurrentelementif(title){title=false;}}@Overridepublicvoidcharacters(char[]ch,intstart,intlength){//Processingcharacterdatainsideanelementif(title){StringbookTitle=newString(ch,start,length);System.out.println("Booktitle:"+bookTitle);nameList.add(bookTitle);}}}publicstaticvoidmain(String[]args)throwsSAXException,IOException{XMLReaderparser=XMLReaderFactory.createXMLReader();BookHandlerbookHandler=(newSAXParser()).newBookHandler();parser.setContentHandler(bookHandler);parser.parse("books.xml");System.out.println(bookHandler.getNameList());}}
SAX剖析器接口和事务处置器接口界说在org.xml.sax包中。次要的接口包含ContentHandler、DTDHandler、EntityResolver及ErrorHandler。个中ContentHandler是次要的处置器接口,用于处置基础的文档剖析事务;DTDHandler和EntityResolver接口用于处置与DTD考证和实体剖析相干的事务;ErrorHandler是基础的毛病处置接口。DefaultHandler类完成了上述四个事务处置接口。下面的例子中BookHandler承继了DefaultHandler类,并掩盖了个中的五个回调办法startDocument()、endDocument()、startElement()、endElement()及characters()以到场本人的事务处置逻辑。
Digester剖析XML
为了满意将XML转换为JavaBean的特别需求,Apache旗下的一个名为Digester的工具为我们供应了这么一个选择。因为终极是将XML转化为JavaBean存储在内存傍边,故而剖析功能等方面实在与利用者并没有多年夜干系。剖析的关头在于用以婚配XML的形式和划定规矩等,因为该工具较为庞大,限于篇幅,作者只能赐与复杂的先容。
上面是一个Digester剖析XML的例子片断:
清单4.Digester剖析XML

12345678910111213//界说要剖析的XML的路径,并初始化工具类Fileinput=newFile("books.xml");Digesterdigester=newDigester();//假如碰着了这个标签,应当初始化test.myBean.Books这个JavaBean并填装相干内容digester.addObjectCreate("books","test.myBean.Books");digester.addSetProperties("books");//假如碰着了这个标签,同上初始化test.myBean.Book这个JavaBeandigester.addObjectCreate("books/book","test.myBean.Book");digester.addSetProperties("books/book");//经由过程挪用下面已初始化过的JavaBean的addBook()办法来把多个加到一个汇合中digester.addSetNext("books/book","addBook","test.myBean.Book");//界说好了下面的剖析划定规矩后,就能够入手下手举行剖析事情了Booksbooks=(Books)digester.parse(input);
上述代码复杂的向读者展现了Digester处置XML的一些要点,次要是申明了一些形式和划定规矩的婚配。简言之,Digester就是一种用来把一个XML转化为一个与该XML布局相似的JavaBean。你能够把XML根元素设想成一个JavaBean,该根元素的attribute就是这个JavaBean的各类Field,当该根元素有其他子tag时,又要把这个子tag设想成一个个新的XML,将其视为一个新的JavaBean,并作为一个Field到场到父Bean傍边,然后以此类推,经由过程轮回的体例将全部XML举行剖析。
停止语
本文先容了Java剖析XML的三种经常使用手艺,个中DOM易于上手,程序易于了解,但弱点在于占用内存年夜,不合适于剖析较年夜的XML文件;SAX基于事务模子占用体系资本少,可以胜任较年夜的XML文件剖析,但剖析历程较为烦琐查找元素不便利;Digester/JAXB基于上述两种手艺衍生而来。文中的实例向读者展现了三种API的基础利用办法,在实践开辟过程当中利用那种手艺剖析XML更好要根据各自的优弱点视详细情形而定。

他们对jsp,servlet,javabean进行封装就是为了展示他们的某个思想,与java的开发并没有必然的关系,也不见得在所以情况下,别人使用起来会简单。
海妖 该用户已被删除
沙发
发表于 2015-1-21 07:48:30 | 只看该作者
有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)
精灵巫婆 该用户已被删除
板凳
发表于 2015-1-30 07:48:38 | 只看该作者
Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
愤怒的大鸟 该用户已被删除
地板
发表于 2015-2-6 08:41:41 | 只看该作者
科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
小女巫 该用户已被删除
5#
发表于 2015-2-10 04:46:16 | 只看该作者
有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)
爱飞 该用户已被删除
6#
发表于 2015-2-15 22:52:00 | 只看该作者
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
若天明 该用户已被删除
7#
发表于 2015-2-18 15:12:22 | 只看该作者
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
谁可相欹 该用户已被删除
8#
发表于 2015-3-6 08:14:12 | 只看该作者
还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。
活着的死人 该用户已被删除
9#
发表于 2015-3-7 15:19:36 | 只看该作者
如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。
再见西城 该用户已被删除
10#
发表于 2015-3-8 16:35:04 | 只看该作者
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
柔情似水 该用户已被删除
11#
发表于 2015-3-16 05:35:29 | 只看该作者
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
小魔女 该用户已被删除
12#
发表于 2015-3-22 20:12:30 | 只看该作者
你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-9-28 15:28

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表