我们的Java应用程序从许多外部系统接收XML消息,我们希望从这些系统创建域对象。 我们没有这些文档的模式。
目前我们正在使用XPath从XML中提取字符串,然后在新域对象上调用setter。我们使用自制的XmlUtils类来完成此任务。
foo.setBar(XmlUtils.number("/bar", document));
有哪些替代的基于Java的方法,它们不需要访问文档的模式?
答案 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)
其他可能性是JAXB。它是基于注释的,是2方向的。唯一可能的问题是,有时很难将任何类映射到任何xml架构。但是,如果您可以更改其中至少一个(XML类)或更好,我建议您使用JAXB。