逍遥一派 发表于 2015-1-18 11:37:02

JAVA教程之Java与XML团结编程之DOM篇

为什么外国人还要写那些框架进行代码封装,他们不就是为了别人使用时可以更简单么!如果要达到一个企业级项目的不用框架是很难的。小一些的项目还行,大的光是MVC模式的设计的编码量就够大的了。还有性能方面,单轮windows,这个工具是微软写的,。dom|xml|编程DOM开端

DOM是DocumentObjectModel的缩写,即文档对象模子。后面说过,XML将数据构造为一颗树,以是DOM就是对这颗树的一个对象描叙。普通的说,就是经由过程剖析XML文档,为XML文档在逻辑上创建一个树范型,树的节点是一个个对象。我们经由过程存取这些对象就可以够存取XML文档的内容。

上面我们来看一个复杂的例子,看看在DOM中,我们是怎样来操纵一个XML文档的。

这是一个XML文档,也是我们要操纵的对象:

<?xmlversion="1.0"encoding="UTF-8"?><messages><message>Good-byeserialization,helloJava!</message></messages>


上面,我们必要把这个文档的内容剖析到一个个的Java对象中往供程序利用,使用JAXP,我们只需几行代码就可以做到这一点。起首,我们必要创建一个剖析器工场,以使用这个工场来取得一个详细的剖析器对象:

DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();


我们在这里利用DocumentBuilderFacotry的目标是为了创立与详细剖析器有关的程序,当DocumentBuilderFactory类的静态办法newInstance()被挪用时,它依据一个体系变量来决意详细利用哪个剖析器。又由于一切的剖析器都从命于JAXP所界说的接口,以是不管详细利用哪个剖析器,代码都是一样的。以是当在分歧的剖析器之间举行切换时,只必要变动体系变量的值,而不必变动任何代码。这就是工场所带来的优点。这个工场形式的详细完成,能够参看上面的类图。

DocumentBuilderdb=dbf.newDocumentBuilder();


当取得一个工场对象后,利用它的静态办法newDocumentBuilder()办法能够取得一个DocumentBuilder对象,这个对象代表了详细的DOM剖析器。但详细是哪种剖析器,微软的大概IBM的,关于程序而言其实不主要。

然后,我们就能够使用这个剖析器来对XML文档举行剖析了:

Documentdoc=db.parse("c:/xml/message.xml");


DocumentBuilder的parse()办法承受一个XML文档名作为输出参数,前往一个Document对象,这个Document对象就代表了一个XML文档的树范型。今后一切的对XML文档的操纵,都与剖析器有关,间接在这个Document对象长进行操纵就能够了。而详细对Document操纵的办法,就是由DOM所界说的了。


Jaxp撑持W3C所保举的DOM2。假如你对DOM很熟习,那末上面的内容就很复杂了:只必要依照DOM的标准来举行办法挪用就能够。固然,假如你对DOM不分明,也毋须着急,前面我们会有具体的先容。在这儿,你所要晓得并切记的是:DOM是用来描叙XML文档中的数据的模子,引进DOM的全体缘故原由就是为了用这个模子来操纵XML文档的中的数据。DOM标准中界说有节点(即对象)、属性和办法,我们经由过程这些节点的存取来存取XML的数据。

从下面失掉的Document对象入手下手,我们就能够入手下手我们的DOM之旅了。利用Document对象的getElementsByTagName()办法,我们能够失掉一个NodeList对象,一个Node对象代表了一个XML文档中的一个标签元素,而NodeList对象,不雅其名而知其意,所代表的是一个Node对象的列表:

NodeListnl=doc.getElementsByTagName("message");


我们经由过程如许一条语句所失掉的是XML文档中一切<message>标签对应的Node对象的一个列表。然后,我们可使用NodeList对象的item()办法来失掉列表中的每个Node对象:

Nodemy_node=nl.item(0);


当一个Node对象被创建以后,保留在XML文档中的数据就被提掏出来并封装在这个Node中了。在这个例子中,要提取Message标签内的内容,我们一般会利用Node对象的getNodeValue()办法:

Stringmessage=my_node.getFirstChild().getNodeValue();

请注重,这里还利用了一个getFirstChild()办法来取得message上面的第一个子Node对象。固然在message标签上面除文本外并没有别的子标签大概属性,可是我们保持在这里利用getFirseChild()办法,这次要和W3C对DOM的界说有关。W3C把标签内的文本部分也界说成一个Node,以是先要失掉代表文本的谁人Node,我们才干够利用getNodeValue()来猎取文本的内容。

如今,既然我们已可以从XML文件中提掏出数据了,我们就能够把这些数据用在符合的中央,来修建使用程序。

上面的内容,我们将更多的存眷DOM,为DOM作一个较为具体的剖析,使我们利用起来更加轻车熟路。

DOM详解
1.基础的DOM对象

DOM的基础对象有5个:Document,Node,NodeList,Element和Attr。上面就这些对象的功效和完成的办法作一个大抵的先容。

Document对象代表了全部XML的文档,一切别的的Node,都以必定的按次包括在Document对象以内,分列成一个树形的布局,程序员能够经由过程遍历这颗树来失掉XML文档的一切的内容,这也是对XML文档操纵的出发点。我们老是先经由过程剖析XML源文件而失掉一个Document对象,然后再来实行后续的操纵。别的,Document还包括了创立别的节点的办法,好比createAttribut()用来创立一个Attr对象。它所包括的次要的办法有:

createAttribute(String):用给定的属性名创立一个Attr对象,并可在厥后利用setAttributeNode办法来安排在某一个Element对象下面。

createElement(String):用给定的标署名创立一个Element对象,代表XML文档中的一个标签,然后就能够在这个Element对象上增加属性或举行别的的操纵。

createTextNode(String):用给定的字符串创立一个Text对象,Text对象代表了标签大概属性中所包括的纯文本字符串。假如在一个标签内没有别的的标签,那末标签内的文本所代表的Text对象是这个Element对象的独一子对象。

getElementsByTagName(String):前往一个NodeList对象,它包括了一切给定标署名字的标签。

getDocumentElement():前往一个代表这个DOM树的根节点的Element对象,也就是代表XML文档根元素的谁人对象。

Node对象是DOM布局中最为基础的对象,代表了文档树中的一个笼统的节点。在实践利用的时分,很少会真实的用到Node这个对象,而是用到诸如Element、Attr、Text等Node对象的子对象来操纵文档。Node对象为这些对象供应了一个笼统的、大众的根。固然在Node对象中界说了对其子节点举行存取的办法,可是有一些Node子对象,好比Text对象,它其实不存在子节点,这一点是要注重的。Node对象所包括的次要的办法有:

appendChild(org.w3c.dom.Node):为这个节点增加一个子节点,并放在一切子节点的最初,假如这个子节点已存在,则先把它删失落再增加出来。

getFirstChild():假如节点存在子节点,则前往第一个子节点,对等的,另有getLastChild()办法前往最初一个子节点。

getNextSibling():前往在DOM树中这个节点的下一个兄弟节点,对等的,另有getPreviousSibling()办法前往其前一个兄弟节点。

getNodeName():依据节点的范例前往节点的称号。

getNodeType():前往节点的范例。

getNodeValue():前往节点的值。

hasChildNodes():判别是否是存在有子节点。

hasAttributes():判别这个节点是不是存在有属性。

getOwnerDocument():前往节点所处的Document对象。

insertBefore(org.w3c.dom.Nodenew,org.w3c.dom.Noderef):在给定的一个子对象前再拔出一个子对象。

removeChild(org.w3c.dom.Node):删除给定的子节点对象。

replaceChild(org.w3c.dom.Nodenew,org.w3c.dom.Nodeold):用一个新的Node对象取代给定的子节点对象。

NodeList对象,望文生义,就是代表了一个包括了一个大概多个Node的列表。能够复杂的把它当作一个Node的数组,我们能够经由过程办法来取得列表中的元素:

GetLength():前往列表的长度。

Item(int):前往指定地位的Node对象。

Element对象代表的是XML文档中的标签元素,承继于Node,亦是Node的最次要的子对象。在标签中能够包括有属性,因此Element对象中有存取其属性的办法,而任何Node中界说的办法,也能够用在Element对象下面。

getElementsByTagName(String):前往一个NodeList对象,它包括了在这个标签中其下的子孙节点中具有给定标署名字的标签。

getTagName():前往一个代表这个标署名字的字符串。

getAttribute(String):前往标签中给定属性称号的属性的值。在这儿必要次要的是,应为XML文档中同意有实体属性呈现,而这个办法对这些实体属性其实不合用。这时候候必要用到getAttributeNodes()办法来失掉一个Attr对象来举行进一步的操纵。

getAttributeNode(String):前往一个代表给定属性称号的Attr对象。

Attr对象代表了某个标签中的属性。Attr承继于Node,可是由于Attr实践上是包括在Element中的,它其实不能被看做是Element的子对象,因此在DOM中Attr并非DOM树的一部分,以是Node中的getparentNode(),getpreviousSibling()和getnextSibling()前往的都将是null。也就是说,Attr实际上是被看做包括它的Element对象的一部分,它其实不作为DOM树中独自的一个节点呈现。这一点在利用的时分要同别的的Node子对象相区分。

必要申明的是,下面所说的DOM对象在DOM中都是用接口界说的,在界说的时分利用的是与详细言语有关的IDL言语来界说的。因此,DOM实在能够在任何面向对象的言语中完成,只需它完成了DOM所界说的接口和功效就能够了。同时,有些办法在DOM中并没有界说,是用IDL的属性来表达的,当被映照到详细的言语时,这些属性被映照为响应的办法。

2.DOM实例

有了下面的先容,信任你对DOM了解的更多了吧。上面的例子将让你对DOM加倍熟习起来。

先说说这个例子究竟要做的是甚么吧,我们但愿在一个名为link.xml文件中保留了一些URL地点,经由过程一个复杂的程序,我们能够经由过程DOM把这些URL读出并显现出来,也能够反过去向这个XML文件中写进到场的URL地点。很复杂,却很有用,也充足来例示DOM的尽年夜部分用法了。

XML文件自己不庞大,就不给出它的DTD了。link.xml:


<?xmlversion="1.0"standalone="yes"?><links><link><text>JSPInsider</text><urlnewWindow="no">http://www.jspinsider.com</url><author>JSPInsider</author><date><day>2</day><month>1</month><year>2001</year></date><description>AJSPinformationsite.</description></link><link><text>ThemakersofJava</text><urlnewWindow="no">http://java.sun.com</url><author>SunMicrosystems</author><date><day>3</day><month>1</month><year>2001</year></date><description>SunMicrosystemswebsite.</description></link><link><text>ThestandardJSPcontainer</text><urlnewWindow="no">http://jakarta.apache.org</url><author>ApacheGroup</author><date><day>4</day><month>1</month><year>2001</year></date><description>Somegreatsoftware.</description></link></links>

第一个程序我们称为xmldisplay.java,详细的程序清单能够在附件中找到。次要的功效就是读取这个XML文件中各个节点的内容,然后在格局化输入在System.out上,我们来看看这个程序:

importjavax.xml.parsers.*;importorg.w3c.dom.*;

这是引进需要的类,由于在这里利用的是Sun所供应的XML剖析器,因此必要引进java.xml.parsers包,个中包括了有DOM剖析器和SAX剖析器的详细完成。org.w3c.dom包中界说了w3c所制订的DOM接口。

DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();DocumentBuilderbuilder=factory.newDocumentBuilder();Documentdoc=builder.parse("links.xml");doc.normalize();

除下面讲到的,另有一个小技能,对Document对象挪用normalize(),能够往失落XML文档中作为格局化内容的空缺而映照在DOM树中的不用要的TextNode对象。不然你失掉的DOM树大概其实不如你所设想的那样。出格是在输入的时分,这个normalize()更加有效。

NodeListlinks=doc.getElementsByTagName("link");

方才说过,XML文档中的空缺符也会被作为对象映照在DOM树中。因此,间接挪用Node办法的getChildNodes办法偶然候会有些成绩,偶然不克不及够前往所希冀的NodeList对象。办理的举措是利用Element的getElementByTagName(String),前往的NodeLise就是所等候的对象了。然后,能够用item()办法提取想要的元素。

for(inti=0;i<links.getLength();i++){Elementlink=(Element)links.item(i);System.out.print("Content:");System.out.println(link.getElementsByTagName("text").item(0).getFirstChild().getNodeValue());System.out.print("URL:");System.out.println(link.getElementsByTagName("url").item(0).getFirstChild().getNodeValue());System.out.print("Author:");System.out.println(link.getElementsByTagName("author").item(0).getFirstChild().getNodeValue());System.out.print("Date:");Elementlinkdate=(Element)link.getElementsByTagName("date").item(0);Stringday=linkdate.getElementsByTagName("day").item(0).getFirstChild().getNodeValue();Stringmonth=linkdate.getElementsByTagName("month").item(0).getFirstChild().getNodeValue();Stringyear=linkdate.getElementsByTagName("year").item(0).getFirstChild().getNodeValue();System.out.println(day+"-"+month+"-"+year);System.out.print("Description:");System.out.println(link.getElementsByTagName("description").item(0).getFirstChild().getNodeValue());System.out.println();}

下面的代码片段就完成了对XML文档内容的格局化输入。只需注重到一些细节的成绩,好比getFirstChile()办法和getElementsByTagName()办法的利用,这些仍是对照简单的。

上面的内容,就是在修正了DOM树后从头写进到XML文档中往的成绩了。这个程序名为xmlwrite.java。在JAXP1.0版本中,并没有间接的类和办法可以处置XML文档的写进成绩,必要借助别的包中的一些帮助类。而在JAXP1.1版本中,引进了对XSLT的撑持,所谓XSLT,就是对XML文档举行变更(Translation)后,失掉一个新的文档布局。使用这个新到场的功效,我们就可以够很便利的把重生成大概修正后的DOM树重新写回到XML文件中往了,上面我们来看看代码的完成,这段代码的次要功效是向links.xml文件中到场一个新的link节点:

importjavax.xml.parsers.*;importjavax.xml.transform.*;importjavax.xml.transform.dom.DOMSource;importjavax.xml.transform.stream.StreamResult;importorg.w3c.dom.*;

新引进的java.xml.transform包中的几个类,就是用来处置XSLT变更的。

我们但愿在下面的XML文件中到场一个新的link节点,因此起首仍是要读进links.xml文件,构建一个DOM树,然后再对这个DOM树举行修正(增加节点),最初把修正后的DOM写回到links.xml文件中:

DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();DocumentBuilderbuilder=factory.newDocumentBuilder();Documentdoc=builder.parse("links.xml");doc.normalize();//---获得变量----Stringtext="HanzhongsHomepage";Stringurl="www.hzliu.com";Stringauthor="HzliuLiu";Stringdiscription="AsitefromHanzhongLiu,giveulotsofsuprise!!!";

为了看清重点,简化程序,我们把要到场的内容硬编码到影象String对象中,而实践操纵中,常常使用一个界面来提取用户输出,大概经由过程JDBC从数据库中提取想要的内容。

Texttextseg;Elementlink=doc.createElement("link");

起首应当了然的是,不管甚么范例的Node,Text型的也好,Attr型的也好,Element型的也好,它们的创立都是经由过程Document对象中的createXXX()办法来创立的(XXX代表详细要创立的范例),因而,我们要向XML文档中增加一个link项目,起首要创立一个link对象:

Elementlinktext=doc.createElement("text");textseg=doc.createTextNode(text);linktext.appendChild(textseg);link.appendChild(linktext);Elementlinkurl=doc.createElement("url");textseg=doc.createTextNode(url);linkurl.appendChild(textseg);link.appendChild(linkurl);Elementlinkauthor=doc.createElement("author");textseg=doc.createTextNode(author);linkauthor.appendChild(textseg);link.appendChild(linkauthor);java.util.CalendarrightNow=java.util.Calendar.getInstance();Stringday=Integer.toString(rightNow.get(java.util.Calendar.DAY_OF_MONTH));Stringmonth=Integer.toString(rightNow.get(java.util.Calendar.MONTH));Stringyear=Integer.toString(rightNow.get(java.util.Calendar.YEAR));Elementlinkdate=doc.createElement("date");Elementlinkdateday=doc.createElement("day");textseg=doc.createTextNode(day);linkdateday.appendChild(textseg);Elementlinkdatemonth=doc.createElement("month");textseg=doc.createTextNode(month);linkdatemonth.appendChild(textseg);Elementlinkdateyear=doc.createElement("year");textseg=doc.createTextNode(year);linkdateyear.appendChild(textseg);linkdate.appendChild(linkdateday);linkdate.appendChild(linkdatemonth);linkdate.appendChild(linkdateyear);link.appendChild(linkdate);Elementlinkdiscription=doc.createElement("description");textseg=doc.createTextNode(discription);linkdiscription.appendChild(textseg);link.appendChild(linkdiscription);

创立节点的历程大概有些一模一样,但必要注重的中央是,对Element中所包括的text(在DOM中,这些text也是代表了一个Node的,因而也必需为它们创立响应的node),不克不及间接用Element对象的setNodeValue()办法来设置这些text的内容,而必要用创立的Text对象的setNodeValue()办法来设置文本,如许才干够把创立的Element和其文本内容增加到DOM树中。看看后面的代码,你会更好的了解这一点:

doc.getDocumentElement().appendChild(link);

最初,不要健忘把创立好的节点增加到DOM树中。Document类的getDocumentElement()办法,前往代表文档根节点的Element对象。在XML文档中,根节点必定是独一的。

TransformerFactorytFactory=TransformerFactory.newInstance();Transformertransformer=tFactory.newTransformer();DOMSourcesource=newDOMSource(doc);StreamResultresult=newStreamResult(newjava.io.File("links.xml"));transformer.transform(source,result);

然后就是用XSLT把DOM树输入了。这里的TransformerFactory也一样使用了工场形式,使得详细的代码同详细的变更器有关。完成的办法和DocumentBuilderFactory不异,这儿就不赘述了。Transformer类的transfrom办法承受两个参数、一个数据源Source和一个输入方针Result。这里分离利用的是DOMSource和StreamResult,如许就可以够把DOM的内容输入到一个输入流中,当这个输入流是一个文件的时分,DOM的内容就被写进到文件中往了。

你对java乐观有点盲目。java的关键就是在服务器上表现优异,而且它提供了整个开发所需要的工具。应该是说,看哪天。net有没有机会赶上java。

深爱那片海 发表于 2015-1-21 11:09:20

是一种为 Internet发展的计算机语言

第二个灵魂 发表于 2015-1-21 21:46:35

接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。

飘飘悠悠 发表于 2015-1-27 06:23:44

http://www.jdon.com/去下载,或到同济技术论坛的服务器ftp://nro.shtdu.edu.cn去下,安装上有什么问题,可以到论坛上去提问。

柔情似水 发表于 2015-2-5 00:23:37

学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。

再现理想 发表于 2015-2-6 09:35:39

另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。

飘灵儿 发表于 2015-2-15 22:07:35

所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。

再见西城 发表于 2015-2-17 00:54:55

在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。

老尸 发表于 2015-3-3 22:28:55

是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言

简单生活 发表于 2015-3-5 00:12:58

Java 编程语言的风格十分接近C、C++语言。

若相依 发表于 2015-3-6 19:26:57

自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。

若天明 发表于 2015-3-13 06:19:41

是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言

小妖女 发表于 2015-4-4 12:22:38

Java 编程语言的风格十分接近C、C++语言。

谁可相欹 发表于 2015-4-6 13:05:38

Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站

因胸联盟 发表于 2015-4-7 00:25:55

自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。

爱飞 发表于 2015-4-15 02:07:07

一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。

乐观 发表于 2015-5-6 07:11:41

一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从

兰色精灵 发表于 2015-6-9 21:49:45

至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。

蒙在股里 发表于 2015-6-18 13:34:36

在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。

海妖 发表于 2015-6-19 14:07:01

你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
页: [1]
查看完整版本: JAVA教程之Java与XML团结编程之DOM篇