本文簡要的討論了Java語言編程中更新XML文檔的四種常用方法,并且分析這四種方法的優(yōu)劣。其次,本文還對如何控制Java程序輸出的XML文檔的格式做了展開論述。
JAXP是Java API for XML Processing的英文字頭縮寫,中文含義是:用于XML文檔處理的使用Java語言編寫的編程接口。JAXP支持DOM、SAX、XSLT等標(biāo)準(zhǔn)。為了增強(qiáng)JAXP使用上的靈活性,開發(fā)者特別為JAXP設(shè)計(jì)了一個Pluggability Layer,在Pluggability Layer的支持之下,JAXP既可以和具體實(shí)現(xiàn)DOM API、SAX API 的各種XML解析器(XML Parser,例如Apache Xerces)聯(lián)合工作,又可以和具體執(zhí)行XSLT標(biāo)準(zhǔn)的XSLT處理器(XSLT Processor,例如Apache Xalan)聯(lián)合工作。應(yīng)用Pluggability Layer的好處在于:我們只需要熟悉JAXP各個編程接口的定義即可,而不需要對所采用的具體的XML解析器、XSLT處理器有很深入的了解。比如在某個Java程序中,通過JAXP調(diào)用XML解析器Apache Crimson對XML文檔進(jìn)行處理,如果我們希望使用別的XML解析器(比如Apache Xerces),以便提高該程序的性能,那么原程序代碼可能不需要任何改變,直接就可以使用(你所需要做的事情只是將包含Apache Xerces代碼的jar文件加入到環(huán)境變量CLASSPATH中,而將包含Apache Crimson代碼的jar文件在環(huán)境變量CLASSPATH中刪除)。
目前JAXP已經(jīng)應(yīng)用的十分普遍了,可以說是Java語言中處理XML文檔的標(biāo)準(zhǔn)API。有些初學(xué)者在學(xué)習(xí)使用JAXP的過程中,經(jīng)常會提出這樣的問題:我編寫的程序?qū)OM Tree做了更新,但是當(dāng)程序退出以后,原始的XML文檔并沒有改變,還是老樣子,如何實(shí)現(xiàn)對原始XML文檔和DOM Tree的同步更新呢?咋一看來,在JAXP中似乎沒有提供相應(yīng)的接口/方法/類,這是很多初學(xué)者都感到困惑的問題。本文的主旨就在于解決這個問題,簡單的介紹幾種常用的同步更新原始XML文檔和DOM Tree的方法。為了縮小討論的范圍,本文所涉及的XML解析器僅包括Apache Crimson和Apache Xerces,而XSLT處理器僅僅使用Apache Xalan。
方法一:直接讀寫XML文檔
這也許是最笨最原始的辦法了。當(dāng)程序獲取DOM Tree之后,應(yīng)用DOM模型的Node接口的各個方法對DOM Tree進(jìn)行更新,下一步應(yīng)該對原始的XML文檔進(jìn)行更新了。我們可以運(yùn)用遞歸的辦法或者是應(yīng)用TreeWalker類,遍歷整個DOM Tree,與此同時,將DOM Tree的每一個節(jié)點(diǎn)/元素依次寫入到預(yù)先打開的原始XML文檔中,當(dāng)DOM Tree被遍歷完全之后,DOM Tree和原始的XML文檔就實(shí)現(xiàn)了同步更新。實(shí)際中,這個方法極少使用,不過如果你要編程實(shí)現(xiàn)自己的XML解析器,這種方法還是有可能用得上的。
方法二:使用XmlDocument類
使用XmlDocument類?JAXP中分明沒有這個類呀!是不是作者搞錯了?沒有錯!就是使用XmlDocument類,確切的說,是使用XmlDocument類的write()方法。
在上文已經(jīng)提到過,JAXP可以和各種各樣的XML解析器聯(lián)合使用,這次我們選用的XML解析器是Apache Crimson。XmlDocument(org.apache.crimson.tree.XmlDocument)是Apache Crimson的一個類,并不包含于標(biāo)準(zhǔn)的JAXP中,難怪在JAXP的文檔中找不到XmlDocument類的芳蹤呢?,F(xiàn)在問題出來了,如何應(yīng)用XmlDocument類來實(shí)現(xiàn)更新XML文檔的功能?在XmlDocument類中提供了下面三個write()方法(根據(jù)Crimson最新的版本------Apache Crimson 1.1.3):
public void write (OutputStream out) throws IOException
public void write (Writer out) throws IOException
public void write (Writer out, String encoding) throws IOException
JAXP是Java API for XML Processing的英文字頭縮寫,中文含義是:用于XML文檔處理的使用Java語言編寫的編程接口。JAXP支持DOM、SAX、XSLT等標(biāo)準(zhǔn)。為了增強(qiáng)JAXP使用上的靈活性,開發(fā)者特別為JAXP設(shè)計(jì)了一個Pluggability Layer,在Pluggability Layer的支持之下,JAXP既可以和具體實(shí)現(xiàn)DOM API、SAX API 的各種XML解析器(XML Parser,例如Apache Xerces)聯(lián)合工作,又可以和具體執(zhí)行XSLT標(biāo)準(zhǔn)的XSLT處理器(XSLT Processor,例如Apache Xalan)聯(lián)合工作。應(yīng)用Pluggability Layer的好處在于:我們只需要熟悉JAXP各個編程接口的定義即可,而不需要對所采用的具體的XML解析器、XSLT處理器有很深入的了解。比如在某個Java程序中,通過JAXP調(diào)用XML解析器Apache Crimson對XML文檔進(jìn)行處理,如果我們希望使用別的XML解析器(比如Apache Xerces),以便提高該程序的性能,那么原程序代碼可能不需要任何改變,直接就可以使用(你所需要做的事情只是將包含Apache Xerces代碼的jar文件加入到環(huán)境變量CLASSPATH中,而將包含Apache Crimson代碼的jar文件在環(huán)境變量CLASSPATH中刪除)。
目前JAXP已經(jīng)應(yīng)用的十分普遍了,可以說是Java語言中處理XML文檔的標(biāo)準(zhǔn)API。有些初學(xué)者在學(xué)習(xí)使用JAXP的過程中,經(jīng)常會提出這樣的問題:我編寫的程序?qū)OM Tree做了更新,但是當(dāng)程序退出以后,原始的XML文檔并沒有改變,還是老樣子,如何實(shí)現(xiàn)對原始XML文檔和DOM Tree的同步更新呢?咋一看來,在JAXP中似乎沒有提供相應(yīng)的接口/方法/類,這是很多初學(xué)者都感到困惑的問題。本文的主旨就在于解決這個問題,簡單的介紹幾種常用的同步更新原始XML文檔和DOM Tree的方法。為了縮小討論的范圍,本文所涉及的XML解析器僅包括Apache Crimson和Apache Xerces,而XSLT處理器僅僅使用Apache Xalan。
方法一:直接讀寫XML文檔
這也許是最笨最原始的辦法了。當(dāng)程序獲取DOM Tree之后,應(yīng)用DOM模型的Node接口的各個方法對DOM Tree進(jìn)行更新,下一步應(yīng)該對原始的XML文檔進(jìn)行更新了。我們可以運(yùn)用遞歸的辦法或者是應(yīng)用TreeWalker類,遍歷整個DOM Tree,與此同時,將DOM Tree的每一個節(jié)點(diǎn)/元素依次寫入到預(yù)先打開的原始XML文檔中,當(dāng)DOM Tree被遍歷完全之后,DOM Tree和原始的XML文檔就實(shí)現(xiàn)了同步更新。實(shí)際中,這個方法極少使用,不過如果你要編程實(shí)現(xiàn)自己的XML解析器,這種方法還是有可能用得上的。
方法二:使用XmlDocument類
使用XmlDocument類?JAXP中分明沒有這個類呀!是不是作者搞錯了?沒有錯!就是使用XmlDocument類,確切的說,是使用XmlDocument類的write()方法。
在上文已經(jīng)提到過,JAXP可以和各種各樣的XML解析器聯(lián)合使用,這次我們選用的XML解析器是Apache Crimson。XmlDocument(org.apache.crimson.tree.XmlDocument)是Apache Crimson的一個類,并不包含于標(biāo)準(zhǔn)的JAXP中,難怪在JAXP的文檔中找不到XmlDocument類的芳蹤呢?,F(xiàn)在問題出來了,如何應(yīng)用XmlDocument類來實(shí)現(xiàn)更新XML文檔的功能?在XmlDocument類中提供了下面三個write()方法(根據(jù)Crimson最新的版本------Apache Crimson 1.1.3):
public void write (OutputStream out) throws IOException
public void write (Writer out) throws IOException
public void write (Writer out, String encoding) throws IOException