[英]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;
}
基于谓词的映射
匹配具有值foo
的type
属性的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.