2010-07-08 43 views
0

我正在開發一個應用程序,它使用不同的組件創建一個XHTML文檔,我使用StringTemplate創建組件的文檔數據,然後將它們組合成一個大文檔。這是一個組件的例子:使用StringTemplate創建XML的性能?

public class BoxImpl extends AbstractContainerImpl implements Box { 

    private static final StringTemplate template; 

    static { 
     template = new StringTemplate(
     "<div id=$id$>$content$</div>"); 
    } 

    public BoxImpl(String id) { 
     this.setId(id); 
    } 

    @Override 
    public CharBuffer generate() { 
     // Get a local instance 
     StringTemplate template = BoxImpl.template.getInstanceOf(); 
     // Set ID attribute of box 
     template.setAttribute("id", this.getId()); 
     // Generate view for controls inside this container 
     CharBuffer inner = this.generateInner(); 
     // Add inner data as content attribute 
     template.setAttribute("content", inner == null ? "" : inner.array()); 
     // Return the result 
     return CharBuffer.wrap(BoxImpl.template.toString()); 
    } 

} 

我的問題是,是不是更有效的實現使用XML DOM或者一個StringBuilder這種文檔構建的,相比StringTemplate的?

編輯:我不需要XML驗證。

回答

2

從perfomance的角度來看,我很肯定DOM會比你使用StringTemplate更糟糕。使用StringBuilder的可能有點快,甚至更乾淨外觀(如果隱含使用):

public CharBuffer generate() { 
    String content = inner == null ? "" : inner.array(); 
    return CharBuffer.wrap("<div id=\"" + this.getId() + "\">" + content + "</div>"); 
} 

這樣做很可能是爲了避免臨時字符串的創建完全,即直接寫入一個BufferedOutputWriter的最快方法或PrintWriter。

但總的來說,我會建議使用其中一個專用的Stream Writer API來創建XML文檔。當您將香草字符串直接放入XML文檔而沒有意識到正確轉義特殊字符時,存在幾個非常明顯的缺陷。這些API通常還提供了一種高效的故障診斷實施方式,可以打敗最天真的方法。這些API的例子有:StAX,Apache XMLIO和SAX Transformer。

+1

我不確定這是否已在Java 6中更新,但在以前的版本中,我記得多個字符串連接會導致爲每次出現'+'運算符創建一個新的StringBuilder。 – MikeD 2010-07-08 21:15:38

+0

它已從StringBuffer更改爲Java 1.5的StringBuilder。 – x4u 2010-07-08 21:25:56

+0

@MikeD在1.4和之前,情況確實如此。我相信我記得觀察到5.0中的字節碼不再使用'+'運算符的'StringBuffer'。 – 2010-07-08 21:28:24