Dom4j 如何新增 standalone?
在Java中處理xml檔案的套件有很多,
如:DOM(JAXP Crimson解析器)、SAX 、JDOM和 Dom4j
其詳細介紹和大致的比較可見:Java中四種操作xml方式的比較
其中因為 Dom4j 在效能上比其他的好,所以我就用了Dom4j。
然而好景不常,才一開始便遇到了問題,
翻遍了 Dom4j 1.6.1 的 API文件 也找不到如何在 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。
其中的程式碼大多是 dom4j 官網中的 Quick Start 的範例 :
參考資料:
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 的範例
如:DOM(JAXP Crimson解析器)、SAX 、JDOM和 Dom4j
其詳細介紹和大致的比較可見:Java中四種操作xml方式的比較
其中因為 Dom4j 在效能上比其他的好,所以我就用了Dom4j。
然而好景不常,才一開始便遇到了問題,
翻遍了 Dom4j 1.6.1 的 API文件 也找不到如何在 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。
而有了上面新的 class 之後我們可以用類似以下的程式碼來建立一個 xml 檔,
- import java.io.FileOutputStream;
- import java.io.FileWriter;
- import java.io.IOException;
- import java.io.UnsupportedEncodingException;
- import org.dom4j.io.OutputFormat;
- import org.dom4j.io.XMLWriter;
- public class StandaloneWriter extends XMLWriter {
- public StandaloneWriter(FileOutputStream fileOutputStream, OutputFormat format)
- throws UnsupportedEncodingException {
- super(fileOutputStream, format);
- }
- public StandaloneWriter(FileWriter fileWriter, OutputFormat format)
- throws UnsupportedEncodingException {
- super(fileWriter, format);
- }
- @Override
- protected void writeDeclaration() throws IOException {
- OutputFormat format = getOutputFormat();
- String encoding = format.getEncoding();
- if (!format.isSuppressDeclaration()) {
- if (encoding.equals("UTF8")) {
- writer.write("<?xml version=\"1.0\"");
- if (!format.isOmitEncoding()) {
- writer.write(" encoding=\"UTF-8\"");
- }
- writer.write(" standalone=\"yes\"");
- writer.write("?>");
- } else {
- writer.write("<?xml version=\"1.0\"");
- if (!format.isOmitEncoding()) {
- writer.write(" encoding=\"" + encoding + "\"");
- }
- writer.write(" standalone=\"yes\"");
- writer.write("?>");
- }
- if (format.isNewLineAfterDeclaration()) {
- println();
- }
- }
- }
- }
其中的程式碼大多是 dom4j 官網中的 Quick Start 的範例 :
執行完後就可以產生 xml 檔如下:
- import java.io.FileWriter;
- import org.dom4j.Document;
- import org.dom4j.DocumentHelper;
- import org.dom4j.Element;
- import org.dom4j.io.OutputFormat;
- import org.dom4j.io.XMLWriter;
- public class StandaloneWriterDemo {
- public static void main(String[] args) {
- Document document = DocumentHelper.createDocument();
- Element root = document.addElement( "root" );
- root.addElement( "author" )
- .addAttribute( "name", "James" )
- .addAttribute( "location", "UK" )
- .addText( "James Strachan" );
- root.addElement( "author" )
- .addAttribute( "name", "Bob" )
- .addAttribute( "location", "US" )
- .addText( "Bob McWhirter" );
- XMLWriter writer;
- OutputFormat format = OutputFormat.createPrettyPrint();
- try {
- writer = new StandaloneWriter( new FileWriter( "output.xml" ), format);
- writer.write( document );
- writer.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
關鍵字:Java, Dom4j, standalone, 問題, 如何
- <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
- <root>
- <author name="James" location="UK">James Strachan</author>
- <author name="Bob" location="US">Bob McWhirter</author>
- </root>
參考資料:
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 的範例
留言
張貼留言