本文簡要的討論了Java語言編程中更新XML文檔的四種常用方法,并且分析這四種方法的優(yōu)劣。其次,本文還對如何控制Java程序輸出的XML文檔的格式做了展開論述。
JAXP是Java API for XML Processing的英文字頭縮寫,中文含義是:用于XML文檔處理的使用Java語言編寫的編程接口。JAXP支持DOM、SAX、XSLT等標準。為了增強JAXP使用上的靈活性,開發(fā)者特別為JAXP設計了一個Pluggability Layer,在Pluggability Layer的支持之下,JAXP既可以和具體實現DOM API、SAX API 的各種XML解析器(XML Parser,例如Apache Xerces)聯合工作,又可以和具體執(zhí)行XSLT標準的XSLT處理器(XSLT Processor,例如Apache Xalan)聯合工作。應用Pluggability Layer的好處在于:我們只需要熟悉JAXP各個編程接口的定義即可,而不需要對所采用的具體的XML解析器、XSLT處理器有很深入的了解。比如在某個Java程序中,通過JAXP調用XML解析器Apache Crimson對XML文檔進行處理,如果我們希望使用別的XML解析器(比如Apache Xerces),以便提高該程序的性能,那么原程序代碼可能不需要任何改變,直接就可以使用(你所需要做的事情只是將包含Apache Xerces代碼的jar文件加入到環(huán)境變量CLASSPATH中,而將包含Apache Crimson代碼的jar文件在環(huán)境變量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的每一個節(jié)點/元素依次寫入到預先打開的原始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 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等標準。為了增強JAXP使用上的靈活性,開發(fā)者特別為JAXP設計了一個Pluggability Layer,在Pluggability Layer的支持之下,JAXP既可以和具體實現DOM API、SAX API 的各種XML解析器(XML Parser,例如Apache Xerces)聯合工作,又可以和具體執(zhí)行XSLT標準的XSLT處理器(XSLT Processor,例如Apache Xalan)聯合工作。應用Pluggability Layer的好處在于:我們只需要熟悉JAXP各個編程接口的定義即可,而不需要對所采用的具體的XML解析器、XSLT處理器有很深入的了解。比如在某個Java程序中,通過JAXP調用XML解析器Apache Crimson對XML文檔進行處理,如果我們希望使用別的XML解析器(比如Apache Xerces),以便提高該程序的性能,那么原程序代碼可能不需要任何改變,直接就可以使用(你所需要做的事情只是將包含Apache Xerces代碼的jar文件加入到環(huán)境變量CLASSPATH中,而將包含Apache Crimson代碼的jar文件在環(huán)境變量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的每一個節(jié)點/元素依次寫入到預先打開的原始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 IOException
public void write (Writer out) throws IOException
public void write (Writer out, String encoding) throws IOException