0

我正在开发一个使用不同组件创建 XHTML 文档的应用程序,我使用 StringTemplate 创建组件的文档数据,然后将它们组合成一个大文档。这是一个组件的示例:

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。

但总的来说,我建议使用专用的 Stream Writer API 之一来创建 XML 文档。当您将原版字符串直接放入 XML 文档中,而没有意识到特殊字符的正确转义时,会有几个不明显的缺陷。这些 API 通常还提供了一种失败效率高的实现,它击败了大多数幼稚的方法。此类 API 的示例有:StAX、Apache XMLIO 和 SAX Transformer。

于 2010-07-08T20:58:53.747 回答