0

さまざまなコンポーネントを使用して XHTML ドキュメントを作成するアプリケーションを開発しています。コンポーネントのドキュメント データを作成するために StringTemplate を使用し、それらを 1 つの大きなドキュメントに結合しました。これはコンポーネントの例です:

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());
    }

}

私の質問は、StringTemplate と比較して、XML DOM または StringBuilder を使用してこの種のドキュメント構築を実装する方が効率的ですか?

編集: XML 検証は必要ありません。

4

1 に答える 1

2

パフォーマンスの観点からは、DOM は StringTemplate の使用よりも悪いと確信しています。StringBuilder を使用すると、少し高速になり、見栄えが良くなる可能性があります (暗黙的に使用する場合)。

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

これを行う最も速い方法は、一時的な文字列の作成を完全に回避すること、つまり BufferedOutputWriter または PrintWriter に直接書き込むことです。

しかし、一般的には、XML ドキュメントの作成には専用の Stream Writer API のいずれかを使用することをお勧めします。特殊文字の適切なエスケープを意識せずに普通の文字列を XML ドキュメントに直接挿入すると、いくつかの明らかでない落とし穴があります。これらの API は通常、ほとんどの素朴なアプローチに勝る失敗効率の高い実装も提供します。このような API の例としては、StAX、Apache XMLIO、および SAX Transformer があります。

于 2010-07-08T20:58:53.747 に答える