大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> JSP专区 -> Java编程中更新XML文档的常用方法

Java编程中更新XML文档的常用方法

时间: 2021-07-31 作者:daque

   正文扼要的计划了java谈话编制程序中革新xml文书档案的四种常用本领,而且领会这四种本领的是非。其次,正文还对怎样遏制java步调输入的xml文书档案的方法做了打开阐明。

  jaxp是java api for xml processing的英笔墨头缩写,华文含意是:用来xml文书档案处置的运用java谈话编写的编制程序接口。jaxp扶助dom、sax、xslt等规范。为了巩固jaxp运用上的精巧性,开拓者更加为jaxp安排了一个pluggability layer,在pluggability layer的扶助之下,jaxp既不妨和简直实行dom api、sax api 的百般xml领会器(xml parser,比方apache xerces)共同处事,又不妨和简直实行xslt规范的xslt处置器(xslt processor,比方apache xalan)共同处事。运用pluggability layer的长处在乎:咱们只须要熟习jaxp各个编制程序接口的设置即可,而不须要对所沿用的简直的xml领会器、xslt处置器有很深刻的领会。比方在某个java步调中,经过jaxp挪用xml领会器apache crimson对xml文书档案举行处置,即使咱们蓄意运用其余xml领会器(比方apache xerces),再不普及该步调的本能,那么原步调代码大概不须要任何变换,径直就不妨运用(你所须要做的工作不过将包括apache xerces代码的jar文献介入到情况变量classpath中,而将包括apache crimson代码的jar文献在情况变量classpath中简略)。   暂时jaxp仍旧运用的格外一致了,不妨说是java谈话中处置xml文书档案的规范api。有些入门者在进修运用jaxp的进程中,常常会提出如许的题目:我编写的步调对dom tree做了革新,然而当步调退出此后,原始的xml文书档案并没有变换,仍旧老格式,怎样实行对原始xml文书档案和dom tree的同步革新呢?咋一可见,在jaxp中犹如没有供给相映的接口/本领/类,这是很多入门者都感触迷惑的题目。正文的中心就在乎处置这个题目,大略的引见几种常用的同步革新原始xml文书档案和dom tree的本领。为了减少计划的范畴,正文所波及的xml领会器仅囊括apache crimson和apache xerces,而xslt处置器只是运用apache xalan。   本领一:径直读写xml文书档案   这大概是最笨最原始的方法了。当步调获得dom tree之后,运用dom模子的node接口的各个本领对dom tree举行革新,下一步该当对原始的xml文书档案举行革新了。咱们不妨应用递归的方法大概是运用treewalker类,遍历所有dom tree,与此同声,将dom tree的每一个节点/元素顺序写入到预先翻开的原始xml文书档案中,当dom tree被遍历实足之后,dom tree和原始的xml文书档案就实行了同步革新。本质中,这个本领极少运用,然而即使你要编制程序实行本人的xml领会器,这种本领仍旧有大概用得上的。   本领二:运用xmldocument类   运用xmldocument类?jaxp中明显没有这个类呀!是否作家搞错了?没有错!即是运用xmldocument类,真实的说,是运用xmldocument类的write()本领。   在下文仍旧提到过,jaxp不妨和形形色色的xml领会器共同运用,这次咱们采用的xml领会器是apache crimson。xmldocument(org.apache.crimson.tree.xmldocument)是apache crimson的一个类,并不包括于规范的jaxp中,难怪在jaxp的文书档案中找不到xmldocument类的芳踪呢。此刻题目出来了,怎样运用xmldocument类来实行革新xml文书档案的功效?在xmldocument类中供给了底下三个write()本领(按照crimson最新的本子------apache crimson 1.1.3):

public void write (outputstream out) throws ioexceptionpublic void write (writer out) throws ioexceptionpublic void write (writer out, string encoding) throws ioexception

  上述三个write()本领的重要效率即是输入dom tree中的实质到一定的输入介质中,比方文献输入流、运用步调遏制台之类。那么又怎样运用上述三个write()本领呢?请看底下的java步调代码片断: string name="fancy";documentbuilder parser;documentbuilderfactory factory = documentbuilderfactory.newinstance();try { parser = factory.newdocumentbuilder(); document doc = parser.parse("user.xml"); element newlink=doc.createelement(name); doc.getdocumentelement().appendchild(newlink);((xmldocument)doc).write(new fileoutputstream(new file("xuser1.xml")));}catch (exception e) { //to log it }

  在上头的代码中,开始创造了一个document东西doc,获得完备的dom tree,而后运用node接口的appendchild()本领,在dom tree的结果追加了一个新节点(fancy),结果挪用xmldocument类的write(outputstream out)本领,把dom tree中的实质输入到xuser.xml中(本来也不妨输入到user.xml,革新原始的xml文书档案,在这边为了便于做比较,故而输入到xuser.xml文献中)。须要提防的是不许径直对document东西doc径直挪用write()本领,由于jaxp的document接口并没有设置任何write()本领,以是必需将doc由document东西强迫变换为xmldocument东西,而后本领挪用write()本领,在上头的代码中运用的是write(outputstream out)本领,这个本领运用缺省的utf-8源代码输入dom tree中的实质到一定的输入介质中,即使dom tree中包括中笔墨符,那么输入的截止有大概是乱码,亦即生存所谓的"中国字题目",处置的方法是运用write (writer out, string encoding)本领,显式指定输入时的源代码,比方将第二个参数设为"gb2312",这时候即不生存"中国字题目",输入截止不妨平常表露中笔墨符。   完备的例子请参考下列文献: addrecord.java(见附属类小部件)、user.xml(见附属类小部件)。该例子的运转情况为:windows xp professional、jdk 1.3.1。为了不妨平常编写翻译运转addrecord.java这个步调,你须要到网址http://xml.apache.org/dist/crimson/去载入apache crimson,并将所获得的crimson.jar文献介入到情况变量classpath中。   提防:   apache crimson的后身是sun project x parser,厥后不知何以,由x parser演化为apache crimson,于今apache crimson的很多代码都是从x parser市直接移植过来的。比方下文用到的xmldocument类,它在x parser中是com.sun.xml.xmldocument,到了apache crimson中摇身一变,就形成了org.apache.crimson.tree.xmldocument类,本来它们的绝大局部代码是一律的,大概就package语句和import语句以及文献发端的一段lience有所各别罢了。早期的jaxp是和x parser绑缚在一道的,所以少许老的步调运用了com.sun.xml包,即使你此刻从新编写翻译它们,有大概不许经过,确定即是由于这个因为。厥后的jaxp和apache crimson绑缚在一道,比方jaxp 1.1,即使你运用jaxp 1.1,那么不须要特殊载入apache crimson,也不妨平常编写翻译运转上头的例子(addrecord.java)。最新的jaxp 1.2 ea(early access)标新立异,沿用本能更好的apache xalan和apache xerces辨别动作xslt处置器和xml领会器,不许径直扶助apache crimson了,以是即使你的开拓情况沿用了jaxp 1.2 ea大概是java xml pack(内含jaxp 1.2 ea),那么将没辙径直编写翻译运转上头的例子(addrecord.java),你须要特殊载入并安置apache crimson。

  本领三:运用transformerfactory和transformer类   在jaxp中所供给的规范的革新原始xml文书档案的本领即是挪用xslt引擎,亦即运用transformerfactory和transformer类。请看底下的java代码片断:

//开始创造一个domsource东西,该结构因变量的参数不妨是一个document东西//doc代办变动后的dom tree。domsource doms = new domsource (doc);//创造一个file东西,代办dom tree所包括的数据的输入介质,这是一个xml文献。file f = new file ("xmloutput.xml");//创造一个streamresult东西,该结构因变量的参数不妨取为file东西。streamresult sr = new streamresult (f);//底下挪用jaxp中的xslt引擎来实行输入dom tree中的数据到xml文献中的功效。//xslt引擎的输出为domsource东西,输入为streamresut东西。try {//开始创造一个transformerfactory东西,再由此创造transformer东西。transformer//类十分于一个xslt引擎。常常咱们运用它来处置xsl文献,然而在这边咱们使//用它来输入xml文书档案。transformerfactory tf=transformerfactory.newinstance(); transformer t=tf.newtransformer ();//要害的一步, 挪用transformer东西 (xslt引擎)的transform()本领,该本领的第一//个参数是domsource东西,第二个参数是streamresult东西。t.transform(doms,sr); }catch (transformerconfigurationexception tce){ system.out.println("transformer configuration exception -----");tce.printstacktrace(); }catch (transformerexception te) { system.out.println ("transformer exception ---------"); te.printstacktrace (); }

  在本质的运用中,咱们不妨运用保守的dom api从xml文书档案中获得dom tree,而后按照本质的需要对dom tree实行百般操纵,获得最后的document东西,接下来不妨由此document东西创造domsource东西,剩下的工作即是生搬硬套上头的代码了,步调运转结束后, xmloutput.xml即是你所须要的截止(固然了,你不妨随便变动streamresult类结构因变量的参数,指定各别的输入介质,而不用是老生常谈的xml文书档案)。   这个本领最大的长处在乎不妨得心应手的遏制dom tree中的实质输入到输入介质中的方法,然而光靠transformerfactory类和transformer类并不许实行这个功效,还须要依附outputkeys类的扶助。 完备的例子请参考下列文献: addrecord2.java(见附属类小部件)、user.xml(见附属类小部件)。该例子的运转情况为:windows xp professional、jdk 1.3.1。为了不妨平常编写翻译运转addrecord2.java这个步调,你须要到网址http://java.sun.com去载入安置jaxp 1.1大概java xml pack(java xml pack仍旧内含jaxp了)。   outputkeys类   javax.xml.transform.outputkeys类和java.util.properties类共同运用,不妨遏制jaxp的xslt引擎(transformer类)输入xml文书档案的方法。请看底下的代码片断:

//开始创造一个transformerfactory东西,再由此创造transformer东西。transformerfactory tf=transformerfactory.newinstance(); transformer t=tf.newtransformer ();//获得transformser东西的输入属性,亦即xslt引擎的缺省输入属性,这是一个//java.util.properties东西。properties properties = t.getoutputproperties(); //树立新的输入属性:输入字符源代码为gb2312,如许不妨扶助中笔墨符,xslt引擎所输入//的xml文书档案即使包括了中笔墨符,不妨平常表露,不会展示所谓的"中国字题目"。//请提防outputkeys类的字符串常数outputkeys.encoding。properties.setproperty(outputkeys.encoding,"gb2312"); /革新xslt引擎的输入属性。t.setoutputproperties(properties); //挪用xslt引擎,依照输入属性中的树立,输入dom tree中的实质到输入介质中。t.transform(domsource_object,streamresult_object);

  从上头的步调代码,咱们不丑陋出,经过树立xslt引擎(transformer类)的输入属性,不妨遏制dom tree中的实质的输入方法,这对于咱们定制输入实质是很有扶助的。那么jaxp的xslt引擎(transformer类)有那些输入属性不妨树立呢? javax.xml.transform.outputkeys类设置了很多字符串常数,它们都是不妨自在树立的输入属性,常用的输入属性如次所示:

public static final java.lang.string method

  不妨设为"xml"、"html"、"text"等温。

public static final java.lang.string version

  所按照典型的本子号,即使method设为"xml",那么它的值该当设为"1.0",即使method设为"html",那么它的值该当设为"4.0",即使method设为"text",那么这个输入属性会被忽视。

public static final java.lang.string encoding

  树立输入时所沿用的源代码办法,比方"gb2312"、"utf-8"之类,即使将其树立为"gb2312",不妨处置所谓的"中国字题目"。

public static final java.lang.string omit_xml_declaration

  树立输入到xml文书档案中时能否忽视xml证明,亦即一致于:

<?xml version="1.0" standalone="yes" encoding="utf-8" ?>

  如许的代码。它可选的值有"yes"、"no"。

public static final java.lang.string indent

  ident设定xslt引擎在输入xml文书档案时,能否机动增添特殊的空格,它可选的值为"yes"、"no"。

public static final java.lang.string media_type

  media_type设定输入文书档案的mime典型。   即使设定xslt引擎的输入属性呢?底下咱们来归纳一下:   开始是获得xslt引擎(transformer类)的缺省输入属性的汇合,这须要运用transformer类的getoutputproperties()本领,归来值是一个java.util.properties东西。

properties properties = transformer.getoutputproperties();

  而后是设定新的输入属性,比方:

properties.setproperty(outputkeys.encoding,"gb2312");properties.setproperty(outputkeys.method,"html");properties.setproperty(outputkeys.version,"4.0");………………………………………………………

  结果是革新xslt引擎(transformer类)的缺省输入属性的汇合,这须要运用transformer类的setoutputproperties()本领,参数是一个java.util.properties东西。   咱们编写了一个新的步调,个中运用了outputkeys类,用以遏制xslt引擎的输入属性,该步调的框架结构和前一个步调(addrecord3.java)大概沟通,然而输入截止略有各别。完备的代码请参考下列文献: addrecord3.java(见附属类小部件)、user.xml(见附属类小部件)。该例子的运转情况为:windows xp professional、jdk 1.3.1。为了不妨平常编写翻译运转addrecord3.java这个步调,你须要到网址http://java.sun.com去载入安置jaxp 1.1大概java xml pack(java xml pack内含jaxp了)。

  本领四:运用xalan xml serializer   本领四本来是本领三的一个变种,它须要apache xalan和apache xerces的扶助才不妨运转。例子代码如次所示: //开始创造一个domsource东西,该结构因变量的参数不妨是一个document东西//doc代办变动后的dom tree。domsource domsource = new domsource (doc); //创造一个domresult东西,偶尔生存xslt引擎的输入截止。domresult domresult = new domresult();//底下挪用jaxp中的xslt引擎来实行输入dom tree中的数据到xml文献中的功效。//xslt引擎的输出为domsource东西,输入为domresut东西。try { //开始创造一个transformerfactory东西,再由此创造transformer东西。transformer //类十分于一个xslt引擎。常常咱们运用它来处置xsl文献,然而在这边咱们使 //用它来输入xml文书档案。 transformerfactory tf=transformerfactory.newinstance();  transformer t=tf.newtransformer ();  //树立xslt引擎的属性(必不行少,要不会爆发"中国字题目")。 properties properties = t.getoutputproperties();  properties.setproperty(outputkeys.encoding,"gb2312"); t.setoutputproperties(properties);  //要害的一步, 挪用transformer东西 (xslt引擎)的transform()本领,该本领的第一 //个参数是domsource东西,第二个参数是domresult东西。 t.transform(domsource,domresult); //创造缺省的xalan xml serializer,运用它将偶尔寄存在domresult东西 //(domresult)中的实质以输入流的情势输入到输入介质中。 serializer serializer = serializerfactory.getserializer(outputproperties.getdefaultmethodproperties("xml")); //树立xalan xml serializer的输入属性,这一步必不行少,要不也大概爆发 //所谓的"中国字题目"。 properties prop=serializer.getoutputformat(); prop.setproperty("encoding","gb2312"); serializer.setoutputformat(prop); //创造一个file东西,代办dom tree所包括的数据的输入介质,这是一个xml文献。 file f = new file ("xuser3.xml"); //创造文献输入流东西fos,请提防结构因变量的参数。 fileoutputstream fos=new fileoutputstream(f); //树立xalan xml serializer的输入流。 serializer.setoutputstream(fos); //串行化输入截止。 serializer.asdomserializer().serialize(domresult.getnode());}catch (exception tce){  tce.printstacktrace(); }

  这个本领不太常用,并且犹如有点弄巧成拙,以是咱们就不打开计划了。完备的例子请参考下列文献: addrecord4.java(见附属类小部件)、user.xml(见附属类小部件)。该例子的运转情况为:windows xp professional、jdk 1.3.1。为了不妨平常编写翻译运转addrecord4.java这个步调,你须要到网址http://xml.apache.org/dist/去载入安置apache xalan和apache xerces。   大概是到网址http://java.sun.com/xml/download.html去载入安置java xml pack。由于最新的java xml pack(winter 01 版)包括了apache xalan和apache xerces本领在前。   论断:   正文大概的计划了java谈话编制程序中革新xml文书档案的四种本领。第一种本领是径直读写xml文献,这种本领格外烦琐,并且比拟简单堕落,极少运用,只有你须要开拓本人的xml parser,要不不会运用这种本领。第二种本领是运用apache crimson的xmldocument类,这种本领极为大略,运用简单,即使你采用apache crimson动作xml领会器,那么无妨运用这种本领,然而这种本领犹如功效不高(源于功效卑下的apache crimson),其余,高本子的jaxp大概是java xml pack、jwsdp不径直扶助apache crimson,亦即这种本领不通用。第三种本领是运用jaxp的xslt引擎(transformer类)来输入xml文书档案,这种本领大概是规范的本领了,运用起来格外精巧,更加是不妨自在遏制输入方法,咱们引荐沿用这种本领。第四种本领是第三种本领的变种,沿用了xalan xml serializer,引入了串行化操纵,对于洪量文书档案的窜改/输入有出色性,怅然的是要反复树立xslt引擎的属性和xml serializer的输入属性,比拟烦恼,并且依附于apache xalan和apache xerces本领,通用性略显不及。   除去上头计划的四种本领除外,本质上运用其余api(比方jdom、castor、xml4j、oracle xml parser v2)也有很多方法不妨革新xml文书档案,限于篇幅,在这边就不逐一计划了。

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.