2009年6月17日

Dom4j 如何新增 standalone?


 
在Java中處理xml檔案的套件有很多,
如:DOM(JAXP Crimson解析器)、SAX 、JDOM和 Dom4j
其詳細介紹和大致的比較可見:Java中四種操作xml方式的比較
其中因為 Dom4j 在效能上比其他的好,所以我就用了Dom4j。

然而好景不常,才一開始便遇到了問題,
翻遍了 Dom4j 1.6.1API文件 也找不到如何在 xml 中新增 standalone="yes" 的字樣,
最後搜尋了網路發現是 Dom4j 1.6.1 還不支援這樣做,
如果還是要使用 Dom4j 1.6.1 ,那只能自己再寫一個新的 class 了。

以下是新的 class 的程式碼,分別參考自 DOM4j 学习笔记
[dom4j-user] How do I get standalone='yes' in the header
  1. import java.io.FileOutputStream;
  2. import java.io.FileWriter;
  3. import java.io.IOException;
  4. import java.io.UnsupportedEncodingException;

  5. import org.dom4j.io.OutputFormat;
  6. import org.dom4j.io.XMLWriter;

  7. public class StandaloneWriter extends XMLWriter {

  8. public StandaloneWriter(FileOutputStream fileOutputStream, OutputFormat format)
  9. throws UnsupportedEncodingException {
  10. super(fileOutputStream, format);
  11. }

  12. public StandaloneWriter(FileWriter fileWriter, OutputFormat format)
  13. throws UnsupportedEncodingException {
  14. super(fileWriter, format);
  15. }

  16. @Override
  17. protected void writeDeclaration() throws IOException {
  18. OutputFormat format = getOutputFormat();

  19. String encoding = format.getEncoding();

  20. if (!format.isSuppressDeclaration()) {
  21. if (encoding.equals("UTF8")) {
  22. writer.write("<?xml version=\"1.0\"");

  23. if (!format.isOmitEncoding()) {
  24. writer.write(" encoding=\"UTF-8\"");
  25. }

  26. writer.write(" standalone=\"yes\"");
  27. writer.write("?>");
  28. } else {
  29. writer.write("<?xml version=\"1.0\"");

  30. if (!format.isOmitEncoding()) {
  31. writer.write(" encoding=\"" + encoding + "\"");
  32. }

  33. writer.write(" standalone=\"yes\"");
  34. writer.write("?>");
  35. }

  36. if (format.isNewLineAfterDeclaration()) {
  37. println();
  38. }
  39. }
  40. }
  41. }
而有了上面新的 class 之後我們可以用類似以下的程式碼來建立一個 xml 檔,
其中的程式碼大多是 dom4j 官網中的 Quick Start 的範例
  1. import java.io.FileWriter;

  2. import org.dom4j.Document;
  3. import org.dom4j.DocumentHelper;
  4. import org.dom4j.Element;
  5. import org.dom4j.io.OutputFormat;
  6. import org.dom4j.io.XMLWriter;

  7. public class StandaloneWriterDemo {

  8. public static void main(String[] args) {

  9. Document document = DocumentHelper.createDocument();

  10. Element root = document.addElement( "root" );

  11. root.addElement( "author" )
  12. .addAttribute( "name", "James" )
  13. .addAttribute( "location", "UK" )
  14. .addText( "James Strachan" );

  15. root.addElement( "author" )
  16. .addAttribute( "name", "Bob" )
  17. .addAttribute( "location", "US" )
  18. .addText( "Bob McWhirter" );

  19. XMLWriter writer;
  20. OutputFormat format = OutputFormat.createPrettyPrint();
  21. try {
  22. writer = new StandaloneWriter( new FileWriter( "output.xml" ), format);
  23. writer.write( document );
  24. writer.close();
  25. } catch (Exception e) {
  26. e.printStackTrace();
  27. }
  28. }
  29. }
執行完後就可以產生 xml 檔如下:
  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>

  2. <root>
  3. <author name="James" location="UK">James Strachan</author>
  4. <author name="Bob" location="US">Bob McWhirter</author>
  5. </root>

關鍵字:Java, Dom4j, standalone, 問題, 如何
參考資料:
1. Java中四種操作xml方式的比較
2. Dom4j 1.6.1
3. DOM4j 学习笔记
4. [dom4j-user] How do I get standalone='yes' in the header
5. Quick Start 的範例


更多精選推薦文章

0 意見 :