<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    java生成xml文件的時候如何控制xml的縮進格式

    使用java自帶的xml api生成的xml文件,其格式都是沒有縮進的,每個element都是頂到最前面,今天終于找到了比較好的處理方法,趕緊記下來.

    使用Java標準的JAXP來輸出可以使用:
    Transformer transformer = TransformerFactory.newInstance().newTransformer();
    transformer.setOutputProperty(OutputKeys.INDENT, "yes");
    transformer.transform(new DOMSource(document), new StreamResult(outputFile));
    中間的紅色代碼是用于設置縮進的,比較遺憾的是JAXP只抽象出是否設置縮進(indent: yes|no),但并沒有抽象出設置縮進量長度的常量(indent-number),所以默認的縮進量長度為0。如果有下面這樣一個xml文檔:<root><a><b>c</b></a></root>會被格式化為:
    <root>
    <a>
    <b>c</b>
    </a>
    </root>
    由于JAXP只是一個Java一個處理XML的框架,根據實現的不一樣,可以傳入實現特定的某個Key來設置縮進量。比如在Java 1.4下面,可以通過下面語句將縮進量設為2:
    ransformer.setOutputProperty(
    "{http://xml.apache.org/xslt}indent-amount", "2");

    transformer.setOutputProperty(
     "{http://xml.apache.org/xalan}indent-amount", "2");
    上面兩句不同之處僅在于命名空間。

    而在Java 1.5下面,情況就有些復雜了。Java 1.5集成了JXAP 1.3(Java 1.4集成的是JXAP 1.1,不同之處參見http://java.sun.com/j2se/1.5.0/docs/guide/xml/jaxp/JAXP-Compatibility_150.html),實現基于Xerces類庫。由于內部實現上的Bug,導致了設置縮進的不同:
    TransformerFactory tf = TransformerFactory.newInstance();
    tf.setAttribute("indent-number", new Integer(2));
    Transformer transformer = tf.newTransformer();
    transformer.setOutputProperty(OutputKeys.INDENT, "yes");
    transformer.transform(new DOMSource(document), new StreamResult(new?BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputFile)))));
    注意紅色代碼的不同之處。第一句設置TransformerFactory的indent-number屬性,在Java 1.4下面運行會拋出異常,因為其不支持該屬性,而在Java 1.5中卻只能通過該屬性來設置縮進。后面標為紅色的代碼則是由于Sun實現上的Bug,只有通過StreamResult(Writer)構造函數生成才能正確設置縮進(通過OutputStream或者File生成的StreamResult是無法設置縮進的,其實現上會忽略任何非正式的屬性,而僅僅采用rt.jar下面com\sun\org\apache\xml\internal\serializer\output_xml.properties中的配置。詳細可以在com.sun.org.apache.xml.internal.serializer.ToStream類的setOutputStream方法中加斷點進行分析)
    ?
    如果忽略掉可移植性,確認綁定在Sun的JRE實現上面,則可以通過如下代碼來更好的實現:
    OutputFormat format = new OutputFormat(document);
    format.setIndenting(true);
    format.setIndent(2);
    Writer output = new BufferedWriter( new FileWriter(outputFile) );
    XMLSerializer serializer = new XMLSerializer(output, format);
    serializer.serialize(document);
    但是OutputFormat類和XMLSerializer類都是位于com.sun.org.apache.xml.internal.serialize包下。

    如果應用對增加一個300K左右的jar包不敏感的話,我還是強烈推薦用dom4j來處理xml,其API設計的非常易用,寫出來的代碼比用JXAP寫出來的代碼漂亮多了,也容易維護,也不會出現上面那種兩個Java版本不兼容的問題。

    posted on 2008-05-27 16:31 小牛小蝦 閱讀(3991) 評論(5)  編輯  收藏

    評論

    # re: java生成xml文件的時候如何控制xml的縮進格式 2008-05-27 18:41 隔葉黃鶯

    你可以用 jdom,它可以對輸出格式進行美化

    Format format = Format.getPrettyFormat();
    XMLOutputter outputter = new XMLOutputter(format);

    outputter.output(elmemt,writer);  回復  更多評論   

    # re: java生成xml文件的時候如何控制xml的縮進格式 2008-05-28 09:18 小牛小蝦

    @隔葉黃鶯
    的確,jdom是可以很好的實現,但是我們公司做的是商業產品,所以對使用開源軟件有許多限制,只好盡量用java自己的api  回復  更多評論   

    # re: java生成xml文件的時候如何控制xml的縮進格式 2008-05-28 21:52 隔葉黃鶯

    從來只聽說商業產品在使用非開源要授權的東西才有許多考慮,沒想到你們公司是反其道而行之。只要遵循它的開源協議就行,你們又不需要改 jdom 的源代碼,想怎么用就怎么用,看看 WebSphere、WebLogic 等重頭的商業產品用了多少開源的東西在里面。

    有點不明白你們公司老大的想法,用 Java 自己的 api,那你們開發人員估計只能苦苦受折磨,看著眼邊的美味不能受用,只有垂涎的份。

    最后,補充一個,Java 也是開源的,報告一下給你們公司上層,看是不要改用 .net 那種不開源的東西。不過有點不幸,.net 也開源了少量的源代碼。

    話直了些,只是想說明,在這樣一個信息大爆炸的時代,唯有保持一種開放的心態,就像此次中國接受國外的救援,不失氣節,更受外人賞。

    嘰嘰歪歪,言重了。  回復  更多評論   

    # re: java生成xml文件的時候如何控制xml的縮進格式 2008-05-30 10:49 小牛小蝦

    @隔葉黃鶯
    我想這位兄弟還是不太了解開源啊.開源正如你所說,是要遵守它的協議,但有的開源協議是要求你一旦使用了它的代碼,你就要把你的項目也開源,否則就可以控告你.websphere,weblogic用的開源都是仔細斟酌過其協議的,或者和代碼的擁有者達成了一致.
    我想你也用過很多免費軟件吧,很多軟件都會在安裝的時候有一個聲明(估計你是next過去了),說明該軟件你可以免費用,但不能用作商務用途.所以很多大公司不得不去買商務軟件而不敢用免費的(除非跟軟件作者達成一致)
    最后,補充一下,Java是開源的,而且它在使用協議中規定了可以用于商業軟件開發所以很多公司才敢用的,沒有這一點,就算是開源的也沒有幾個人敢用.還有.net的所謂開源了少量代碼其實完全可以無視,windows還開源了少量代碼呢?你能根據那些代碼寫成xp來嗎?這其實只是像微軟這樣的公司的一個秀而已.
    話直了些,只是想說明,軟件公司永遠都會把自己的代碼當成生命線,我們當然要保持開放的心態,但是在具體的產品開發中,我們必須要確保我們使用的東西是干凈的,中國必將會走向一個保護知識產權的時代.開源是好,它是頂級程序員的天堂,它可以指明軟件發展的方向,但真正的可以賺錢的商業產品,開源肯定是做不過微軟,google,ibm的
    嘰嘰歪歪,言重了
      回復  更多評論   

    # re: java生成xml文件的時候如何控制xml的縮進格式 2008-05-30 18:44 隔葉黃鶯

    有的開源協議是要求你一旦使用了它的代碼,你就要把你的項目也開源,否則就可以控告你

    沒有這樣的開源協議。  回復  更多評論   


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    <2008年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導航

    統計

    常用鏈接

    留言簿(6)

    隨筆檔案

    文章檔案

    eclipse

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 99久久久国产精品免费牛牛四川| 久久国产乱子伦免费精品| 亚洲精品亚洲人成人网| 久久国产乱子免费精品| 国产精品亚洲专区在线观看| 亚洲色大成网站www永久网站| 国产免费观看视频| 久久大香香蕉国产免费网站| 亚洲日韩精品无码AV海量| 亚洲综合无码AV一区二区| 国产又大又粗又长免费视频| 一区免费在线观看| 亚洲中文无码a∨在线观看| 亚洲国产成人久久一区久久 | 成人免费观看一区二区| 青青久久精品国产免费看| 亚洲激情电影在线| 久久国产成人亚洲精品影院| 黄页免费的网站勿入免费直接进入| 亚洲色欲www综合网| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 国产精品亚洲精品日韩电影| 亚洲成A人片在线观看无码不卡| 免费理论片51人人看电影| 91精品国产免费久久国语麻豆| 男女作爱免费网站| 亚洲日韩精品国产一区二区三区| 久久亚洲国产成人精品性色| 在人线av无码免费高潮喷水| 国产福利免费视频| 亚洲国产综合AV在线观看| 亚洲精品国产综合久久一线| 在线观看肉片AV网站免费| 亚洲网站视频在线观看| 中文字幕亚洲天堂| 国产一区二区三区在线免费观看| 美女视频黄免费亚洲| 成人黄网站片免费视频| www免费黄色网| 免费的黄色网页在线免费观看| 亚洲一区二区三区高清在线观看|