自定义Java XMLBuilder与基于标准类的

时间:2010-12-10 11:22:26

标签: java xml jaxp

XML生成的最佳性能解决方案是什么。

我的目标是从代码构建一些简单的XML。我将实现XML Builder的简单自定义StringBuffer实现。另一方面有几个像http://code.google.com/p/java-xmlbuilder/http://code.google.com/p/xmltool/这样的库,它有很好的DSL,但我觉得缺乏性能。

由于我的目标是构建简单的XMLBuilder并具有出色的性能,我想我将构建自定义解决方案。它将具有:

  • 用于XML构造的基于Java的良好DSL(基本上添加标签)
  • 基于StringBuffer的高性能。
  • 添加XML标记时的字符串数据转义处理。
  • 自动缩进

请告知我是否对性能预期有误,并且可能更好地使用现成的库。

UPDATE。为什么我认为标准xml构建器的性能不是很好。

标准XML构建器使用Document Builder Factory并在后台使用类。这些类也经过优化以适合所有用户。例如,我不需要命名空间支持等。

<?xml version="1.0" encoding="utf-8">
<root>
 <testdata>value</testdata>
</root>
</xml>

考虑上面非常简单的XML代码。如果使用标准工具构建,那么只需要制作这么简单的XML就可以完成很多工作。我认为最好自己使用String生成它。

更新2 。性能要求是代码应该尽可能多地生成简单的XML而不是更多。

更新3.感谢大家的好评!现在我更了解我需要什么,并且我的初始目标没有用“性能”这个词设置得非常正确。我的真正目标是使用方便的DSL来使用足够简单的解决方案来描述XML结构并生成XML输出。

我将普通的Java对象用作DSL的XML,并使用XStream库生成XML,这是非常简单的解决方案。

更新4. JAXB。我讨论了XStream vs JAXB,发现JAXB比XStream快。另外我已经在我的项目中使用了JAXB,我喜欢它的标准注释。我改变了主意,现在将继续使用JAXB,因为XStream最初是在JAXB不如今天这么好的时候开发的。

4 个答案:

答案 0 :(得分:4)

我会建议一些非常有争议但仍然......

使用两个库进行性能分析和性能测试

如果你没有时间,假设某些事情很慢,我认为这是错误的选择。 因为如果事实证明它实际上并不慢,那么它将为您节省大量时间来使用已经构建和支持的库/框架。

另一种想法。 您需要根据现有的解决方案测试已完成的高性能解决方案,以检查它是否真的具有高性能。因此,我强烈建议您在开始使用之前测量可用库的性能。

答案 1 :(得分:3)

关于:

  

标准XML构建器使用Document   Builder Factory并与类一起工作   在幕后。还有这些课程   经过优化以适应所有用户。对于   示例我不需要名称空间支持   等

DOM的替代品是StAX(JSR-173)。它是一个非常快的XML流媒体API。有几个实现,我发现Woodstox非常高效。

答案 2 :(得分:2)

有强大而灵活的Groovy NodeBuilder(http://groovy.codehaus.org/GroovyMarkup)。

def root = new NodeBuilder()
  .people(kind:'folks', groovy:true) {
    person(x:123,  name:'James', cheese:'edam') {
      project(name:'groovy')
      project(name:'geronimo')
    }
    person(x:234,  name:'bob', cheese:'cheddar') {
      project(name:'groovy')
      project(name:'drools')
    }
  }
XmlUtil.serialize(root, System.out)

这会产生一个XML文档:

<?xml version="1.0" encoding="UTF-8"?>
<people kind="folks" groovy="true">
  <person x="123" name="James" cheese="edam">
    <project name="groovy"/>
    <project name="geronimo"/>
  </person>
  <person x="234" name="bob" cheese="cheddar">
    <project name="groovy"/>
    <project name="drools"/>
  </person>
</people>

答案 3 :(得分:1)

另一个高性能建议:使用StaxMate - 它与基于Stax的基础XML编写器一样快,速度相当快(每秒40-80兆字节,持续)。只是确保你不使用默认的JDK 6 Stax实现(Sun sjsxp),但更快,比如Woodstox或Aalto。

我强烈建议您不要编写自己的XML编写器;正如其他人所提到的那样,它通常存在风险(很有可能会忘记逃逸的某些部分),而且并非所有这些都可能比现有的高效解决方案更快(并非所有现有解决方案都是高效的;您确实需要找到那些)。最后......除非你真的想写这些东西,为什么不在更有趣和有意义的事情上工作呢?

但如果您确实想要在现有作者之外做一些事情,您可以考虑使用一个简单的编写器并使用您需要的其他功能来增强它。例如,如果您只使用Stax XMLStreamWriter作为基础,则可以很容易地添加简单但有效的抽象。或者,如果你喜欢现有的软件包,看看你是否可以建议改进他们的作者(甚至代码贡献)。