5

什么是 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 标记时的字符串数据转义处理。
  • 自动缩进

如果我对性能期望有误,请提出建议,使用现成的库可能更好。

更新。为什么我认为标准 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 对象作为 XML 的 DSL,并使用 XStream 库生成 XML,这是非常简单的解决方案。

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

4

4 回答 4

4

我会提出一些非常有争议的建议,但仍然......

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

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

另一个想法。您将需要针对已经可用的解决方案测试您完成的高性能解决方案,以检查它是否真的是高性能的。所以我强烈建议在开始自己的库之前测量可用库的性能。

于 2010-12-10T11:45:38.583 回答
3

关于:

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

DOM 的替代方案是 StAX ( JSR-173 )。它是一个非常快的 XML 流 API。有几种实现方式,我发现Woodstox的性能非常好。

于 2010-12-10T16:57:12.420 回答
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>
于 2010-12-10T11:56:23.583 回答
1

另一个高性能建议:使用StaxMate——它与底层基于 Stax 的 XML 编写器一样快,后者相当快(每秒 40 - 80 兆字节,持续)。只要确保您不使用默认的 JDK 6 Stax 实现 (Sun sjsxp),而是使用更快的东西,例如 Woodstox 或 Aalto。

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

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

于 2010-12-21T23:21:51.850 回答