XPath for XML to Domain Object转换器的替代方案

时间:2011-07-13 07:21:37

标签: java xml

我们的Java应用程序从许多外部系统接收XML消息,我们希望从这些系统创建域对象。 我们没有这些文档的模式。

目前我们正在使用XPath从XML中提取字符串,然后在新域对象上调用setter。我们使用自制的XmlUtils类来完成此任务。

foo.setBar(XmlUtils.number("/bar", document));

有哪些替代的基于Java的方法,它们不需要访问文档的模式?

5 个答案:

答案 0 :(得分:6)

注意:我是EclipseLink JAXB (MOXy)负责人,也是JAXB 2.X(JSR-222)专家组的成员。

MOXy提供@XmlPath扩展,使您可以执行基于XPath的映射:

基于路径的映射

匹配bar元素下的foo元素:

@XmlPath("foo/bar/text()")
public int getBar() {
    return bar;
}

基于位置的制图

匹配第二个bar元素:

@XmlPath("bar[2]/text()")
public int getBar() {
    return bar;
}

基于谓词的映射

匹配bar属性的type元素与值foo

@XmlPath("bar[@type='foo']/text()")
public int getBar() {
    return bar;
}

<强>联合

所有上述概念可以一起使用:

@XmlPath("foo[2]/bar[@type='foo']/text()")
public int getBar() {
    return bar;
}

了解更多信息

答案 1 :(得分:1)

我建议使用Apache Commons Digester。使用模式是这样的:

digester.addObjectCreate("parent", Parent.class);
digester.addObjectCreate("parent/child", Child.class);
digester.addCallMethod("parent/child", "setName", 1);
digester.addCallParam("parent/child/name", 0);
digester.addSetNext("parent/child", "addChild");

此外,如果您已经拥有结构类似于source xml的域对象,您可以尝试手动注释它以使用JAXB解组。

答案 2 :(得分:1)

Simple framework。我从来没有使用它,但前段时间我看了一下文档和示例,可能值得仔细研究。它的工作是使用带注释的bean对XML进行Java bean序列化/反序列化。

答案 3 :(得分:1)

我会选择推荐的MOXy,或JAXB(javax.xml.bind,与JDK 6捆绑在一起,可单独为JDK 5提供)。

使用“手动”XPath效率很低,容易出错;如果你真的不关心XML本身,只是XML文档包含的数据,那么数据绑定通常就是这样。这是一个很大的区别(数据与面向文档的XML),并且XPath对于面向文档的用例通常更有用。

答案 4 :(得分:0)

@JustYo提到的Digester非常完美。但是我要补充一些提示:看看DigetserDigester上课。它允许将类映射到XML而无需编写代码。它是使用其他XML文档完成的。很酷。

其他可能性是JAXB。它是基于注释的,是2方向的。唯一可能的问题是,有时很难将任何类映射到任何xml架构。但是,如果您可以更改其中至少一个(XML类)或更好,我建议您使用JAXB。