繁体   English   中英

XPath 的替代品,用于 XML 到域 Object 转换器

[英]Alternatives to XPath for XML to Domain Object converter

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

目前我们正在使用 XPaths 从 XML 中提取字符串,然后在新域 object 上调用 setter。 我们使用自制的 XmlUtils class 来执行此操作。

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

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

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

MOXy 提供了@XmlPath扩展,使您能够进行基于 XPath 的映射:

基于路径的映射

匹配foo bar

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

基于 Position 的映射

匹配第二个bar元素:

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

基于谓词的映射

匹配具有值footype属性的bar元素:

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

结合

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

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

了解更多信息

我建议为此使用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");

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

简单的框架 我从未使用过它,但前段时间我查看了文档和示例,可能值得仔细查看。 它的工作是 Java 使用带注释的 bean 对 XML 进行 bean 序列化/反序列化。

我会使用推荐的 MOXy 或 JAXB(javax.xml.bind,与 JDK 6 捆绑在一起,可用于 JDK 5)。

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

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

其他可能性是 JAXB。 它是基于注释的,并且是 2 向的。 唯一可能的问题是有时很难将 map 任何 class 转换为任何 xml 模式。 但是,如果您可以更改其中至少一个(XML 类)或更好,我建议您使用 JAXB。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM