Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java生成任意XML的好库是什么?_Java_Xml - Fatal编程技术网

从Java生成任意XML的好库是什么?

从Java生成任意XML的好库是什么?,java,xml,Java,Xml,我需要从Java对象生成大量XML文档。对象是深度ORM映射的对象,XML文档用于搜索索引(la Lucene)。我希望能够创建一个配置文件并向其提供一个Java对象,并让它吐出配置中指定的XML。理想情况下,配置将由java端的(可能是深层的)属性映射到XPath或XML端非常类似的东西组成 JAXB不合适,因为它希望创建从对象数据到XML节点的一对一映射。我已经看过JIBX和XStream,但它们似乎都不是为实现我所说的目的而设计的 本质上,我想要的是Dozer,但其设计目的是创建一个XML

我需要从Java对象生成大量XML文档。对象是深度ORM映射的对象,XML文档用于搜索索引(la Lucene)。我希望能够创建一个配置文件并向其提供一个Java对象,并让它吐出配置中指定的XML。理想情况下,配置将由java端的(可能是深层的)属性映射到XPath或XML端非常类似的东西组成

JAXB不合适,因为它希望创建从对象数据到XML节点的一对一映射。我已经看过JIBX和XStream,但它们似乎都不是为实现我所说的目的而设计的

本质上,我想要的是Dozer,但其设计目的是创建一个XML文档作为其目标,而不是另一个JavaBean。从我目前的研究来看,这似乎是我自己写的。有谁能提供更好的选择吗

编辑: 解决方案不能基于修改源Java文件的能力。基于注释的系统对于我在这里的目的完全是无用的。应该可以像在推土机中一样为各个映射定义“转换器”

应该注意的是,我需要能够指定java中的给定输入字段可能在XML输出中的几个不同位置输出,可能在某些情况下被转换,而不是在其他情况下被转换

我已经考虑过对对象进行某种Java到XML的直接转换,然后使用XSLT执行我的任务,但问题是这些对象是具有双向连接的深层对象。任何对象到XML的映射都很难确定对象层次结构的深度,即使它可以跟踪哪些对象应该被忽略,因为它们已经被看到了

我用这个: 你看过吗

特别是,他们网页上的这句话让我觉得它可能会满足你的要求:

尽管可以依靠Castor的默认行为将Java对象封送和解封到XML文档中,但可能需要对这种行为进行更多的控制。例如,如果Java对象模型已经存在,Castor XML映射可以用作XML文档和该Java对象模型之间的桥梁

Castor允许用户使用映射文件指定一些编组/解编组行为。该文件向Castor提供了关于给定XML文档和给定Java对象集如何相互关联的明确信息

另一种可能是;从他们的网页:

JavaXMLMapping(JXM)是一种将Java对象写入XML并再次读取它们的工具。JXM提供了一个默认映射,以便通过调用单个方法将遵循JavaBean命名约定的Java对象写入XML。可以通过在JXM框架中创建和注册映射类来定制默认映射

JXM不同于其他XML绑定工具,它不要求对象包含JXM代码或从JXM代码继承。对象中不包含生成的代码,它们不需要实现JXM接口。定制是通过编写Java代码而不是XML描述符来完成的

看一看

它可以通过外部XML进行配置。可以有多个映射从同一输入对象生成不同的输出


此外,我们也愿意提供帮助—只需在邮件列表上询问即可。

我们过去曾使用Apache Velocity作为一种保持简单的方法

只需为XML创建一个模板,填充一个数据结构,并将数据结构注入到映射中。如果需要,它允许您在运行时更改XML(只要您的数据结构包含所有字段)

这是一种非常快速和灵活的生成文档的方法,它不创建DOM,因此非常节省内存。

很好

您需要的解决方案是:

MOXy是一个带有扩展的JAXB实现

MOXy有一个外部配置文件(基于带有扩展名的JAXB注释):

具有基于XPath的映射,用于深度映射:

设计用于处理ORM映射对象,包括对双向关系的支持:


您没有指定使用哪种ORM,但如果它是hibernate,您也可以使用它来进行Java XML映射。文档不如DB映射好,但使用起来并不难。最大的优势是:您少了一个依赖项,少了一个要学习的框架,而且您所学到的关于DB映射的概念大部分应用于XML映射


请参阅:

看看XOM,它非常容易构建XML文档


这似乎完全是基于注释的。我希望能够严格地通过一个配置文件和一组转换器对象来实现我的目标,以正确地格式化一些数据。此外,我看不到任何为多个output fields.upvoted指定一个输入属性的方法,因为这确实回答了最初的问题。我想我很明显我想要一个配置文件。Castor看起来与我所看到的一切最接近。然而,它以类为中心的配置让我怀疑它是否允许同一输入字段到多个输出的多个映射。我也没有看到任何映射深场的例子。我将进一步研究.JiBX是否适用于此,为什么您不喜欢它?缺点是,如果您弄乱了模板,在某些情况下可能会生成无效/不正确的XML。完全同意。但这并不难解决。如果愿意,可以添加单独的验证阶段。