簡體   English   中英

用Java產生XML內容的正確方法是什么?

[英]What's the right way to produce a XML content in Java?

我已經通過互聯網閱讀了一些問題和教程,例如

但是由於這是我第一次必須使用Java操作XML文檔,所以我仍然有些困惑。 XML內容是用String串聯編寫的,在我看來這是錯誤的。 串聯字符串以生成JSON對象而不是使用JSONObject類是相同的。 這就是現在編寫代碼的方式:

"<msg:restenv xmlns:msg=\"http://www.b2wdigital.com/umb/NEXM_processa_nf_xml_req\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.b2wdigital.com/umb/NEXM_processa_nf_xml_req req.xsd\"><autenticacao><usuario>"
            + usuario + "</usuario><senha>" + StringUtils.defaultIfBlank(UmbrellaRestClient.PARAMETROS_INFRA_UMBRELLA.get("SENHA_UMBRELLA"), "WS.INTEGRADOR")
            + "</senha></autenticacao><parametros><parametro><p_vl_gnre>" + valorGNRE + "</p_vl_gnre><p_cnpj_destinatario>" + cnpjFilial + "</p_cnpj_destinatario><p_num_ped_compra>" + idPedido
            + "</p_num_ped_compra><p_xml_sefaz><![CDATA[" + arquivoNfe + "]]></p_xml_sefaz></parametro></parametros></msg:restenv>"

在我的研究中,我認為我讀過的幾乎所有文章都將SAX視為最佳解決方案,但我從未真正發現對其有用的東西,幾乎所有內容都表明我們必須創建一個處理程序並覆蓋startElement,endElement和characters方法。 。

我不必序列化硬盤或數據庫中的XML文件或其他任何東西,只需要將其內容傳遞給Web服務即可。

所以我的問題確實是,哪種方法正確?

  • 串聯字符串現在的工作方式?
  • 使用Xerces之類的Java API編寫XML文件? 我不知道該怎么做。
  • 讀取帶有流的XML文件,僅更改節點文本? 沒有文件的我的XML像這樣:

     <msg:restenv xmlns:msg="{url}" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="{schemaLocation}"> <autenticacao> <usuario></usuario> <senha></senha> </autenticacao> <parametros> <parametro> <p_vl_gnre></p_vl_gnre> <p_cnpj_destinatario></p_cnpj_destinatario> <p_num_ped_compra></p_num_ped_compra> <p_xml_sefaz><![CDATA[]]></p_xml_sefaz> </parametro> </parametros> </msg:restenv> 
  • 我還讀過一些有關使用Apache Velocity作為模板引擎的信息,因為我實際上不必序列化XML,而我真的很喜歡這種方法,因為我已經使用了該框架,並且它是一個非常簡單的框架。

再說一次,我不是在尋找最佳方法,而是在尋找正確的方法,並附上教程和示例(如果可能)。

這完全取決於上下文。 沒有單一的“正確方法”。

串聯的最大問題是將XML轉義為String常量(這很奇怪),同時轉義可以使用的值,以便它們對於XML文檔正確。

對於小型XML,這很好。

但是對於較大的產品,可能會很痛苦。

如果您的XML大部分都是樣板,只插入了幾個值,則可能會發現使用諸如Velocity之類的模板或其他幾個庫中的任何一個可能是非常有效的。 它有助於使模板保持“本機”狀態(您不必將其包裝在“中”並對其進行轉義),還可以使XML脫離代碼,但可以輕松地標記需要做的部分。

我同意,不僅有一種方法可以這樣做,而且我建議您看一下JAXB。 您可以輕松使用和產生XML,而無需進行任何討厭的String操作。 在這里查找簡單的介紹: https : //docs.oracle.com/javase/tutorial/jaxb/index.html

Will Hartung答案是正確的。 沒有正確的方法,這取決於您的情況。

對於初學者,我建議手動編寫字符串,這樣您就可以大致了解XML,尤其是您的內容。 至於字符串連接的機制,通常會使用StringBuilder而不是String以獲得更好的性能。 需要線程安全的地方,使用StringBuffer

主要問題是內存。

  • 豐富的記憶
    如果您有大量的內存和小的XML文檔,則可以將整個文檔加載到內存中。 這樣,您可以向前,向后遍歷文檔,並且可以任意跳轉。 這種方法稱為文檔對象模型(DOM) 該方法的一個更著名的實現是Apache Xerces 還有其他好的實現。
  • 記憶力不足
    如果您的內存很少,而XML文檔很大,那么您需要從頭到尾瀏覽整個文檔,一次咬一下小塊,以減少內存使用量。 這種方法稱為SAX 您可以找到多個好的實現。

另一個問題是驗證。 是否要根據DTDSchema驗證XML文檔? 有些工具可以這樣做,而有些則不能。

當您需要序列化Java對象的內容並讀回它時,我建議使用Simple XML Serialization庫。 與其他工具相比,具有更快的學習曲線要​​簡單得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM