2012-01-28 101 views
6

什么是在Java中创建XML文档的最快和最有效的方式?有很多图书馆(woodstox,xom,xstream ...),只是想知道是否有人有任何输入。我应该使用代码生成方法(因为XML模式是众所周知的)?或在运行时反射的方法?创建XML的最快和最有效的方法

编辑与附加信息:

  1. 明确定义的XML Schema是可用的和很少改变
  2. 要求是一个Java对象转换为XML,而不是相反
  3. 数以千计的Java对象到XML每秒
  4. 代码生成,代码复杂度,配置,维护等是第二个更高的性能。
+1

你如何定义效率?最少的内存使用情况?最少使用的代码行数?最快做什么?封送?解组大文档?漂亮的打印?你在做什么需要“最快”的库?一定要选择一个基于真正重要的库,而不是一个无关紧要的标准。您可能会发现,选择一个“足够快”的库会更好,因为它比“最快”的库更易于使用,但是使用和维护却令人头疼。 – Paul 2012-01-28 17:44:59

+0

“最高效”的短语不清楚。最有效的内存或CPU有助于澄清。 – 2012-01-28 17:45:45

+1

可能的重复[哪个xml序列化库是面向性能的?](http://stackoverflow.com/questions/5918665/which-xml-serialization-library-is-performance-oriented) – skaffman 2012-01-28 17:49:01

回答

11

如果我是创建一个非常简单的XML内容,我会坚持只有JDK的API,引入任何第三方的依赖。

因此,对于简单的XML,如果我想将映射到Java类(反之亦然),我会去JAXBSee this tutorial看看它是多么容易。

现在。

如果我使用常量方案创建一些更复杂的XML输出,我可能会使用一些模板引擎FreemarkerThymeleaf看起来不错。

最后。

如果我非常有效地创建巨大的XML文件,我会使用SAX parser

我希望你现在明白了,那你有充裕的可能性 - 选择最符合您需要的:)

和乐趣!

+6

我不认为'StringBuilder'是创建有效xml的简单方法。我认为这是最复杂的方式,因为你必须自己做所有事情。看看使用EclipseLink MOXy从对象创建xml是多么容易,例如:[MOXy:Getting Started](http://wiki.eclipse.org/EclipseLink/Examples/MOXy/GettingStarted/TheBasics)这比使用' StringBuilder'。 – Paul 2012-01-28 17:53:05

+0

@保罗,好点。通过说我最简单的意思 - 介绍没有第三方依赖和避免SAX。我将编辑回应。 – 2012-01-28 17:57:50

+1

感谢卢卡斯,正如前面的评论中提到的那样,我想要更快的表现。 XML不是很大。我不需要将XML文件映射到Java对象。所以这有助于缩小范围。我喜欢模板引擎的想法,我会研究它。我会在这里发表我的经验。 – arrehman 2012-01-28 17:57:50

2

首先,序列化是正确的。手写串行器通常不是。例如,他们倾向于忘记字符串“]]>”不能出现在文本节点中。

如果你是一个有能力的Java程序员,编写你自己的序列化程序并不难,但是由于一些非常有能力的Java程序员已经在这里,所以我认为你不可能击败他们足够的余量使其值得编写自己的代码。

除了可能通过提供序列化选项(如缩进或编码,或者像选择行尾)之外,大多数通用库可能会变慢一点。您可以通过避免不需要的功能来挤压额外的性能。另外,一些通用库可能会检查你在它们上面引用的格式,例如检查是否声明了名称空间前缀(如果不是,则声明它们)。如果没有检查,你可能会更快。另一方面,你可能会创建一个速度很快的库,但是可以使用一头猪。将绩效放在所有其他目标之上几乎总是一个错误。

至于可用库的性能,衡量它们,并告诉我们你发现了什么。

+0

你提到了一些关于性能的重要方面。谢谢。 – arrehman 2012-01-28 21:41:47

4

尝试Xembly,一个小型的开源库,使这个XML创建过程非常方便和直观:

String xml = new Xembler(
    new Directives() 
    .add("root") 
    .add("order") 
    .attr("id", "553") 
    .set("$140.00") 
).xml(); 

Xembly是围绕本地Java DOM的包装,并且是一个非常轻量级库(我是开发者)。

+1

我觉得这篇文章有用:http://www.yegor256.com/2014/04/09/xembly-intro.html – 2015-01-01 13:01:30

+0

你的图书馆看起来很有用,但它有效吗?它在适当的时候很好地摆脱冗长,但问题是关于编写XML最快,最有效的方式。看上面的例子,我会说它不是一个很好的解决方案来高效地编写大型的XML文件。尽管我喜欢你的图书馆用于其他用例,但我觉得这是因为他最快,最有效的一个并不准确,你正在推销你的产品而不是提供最好的答案。但如果我错了,请纠正我。 – 2016-05-31 00:26:43

1

我知道最好的方式是使用能够创建节点的XPath引擎。 XMLBeam是能够做到这一点(在这里JUnit测试):

public interface Projection { 

    @XBWrite("/create/some/xml/structure[@even='with Predicates']") 
    void demo(String value); 
} 

@Test 
public void demo() { 
    Projection projection = new XBProjector(Flags.TO_STRING_RENDERS_XML).projectEmptyDocument(Projection.class); 
    projection.demo("Some value"); 
    System.out.println(projection); 
} 

这个程序打印出:

<create> 
    <some> 
     <xml> 
     <structure even="with Predicates">Some value</structure> 
     </xml> 
    </some> 
</create> 
相关问题