我有一个旧的Access数据库,基本上是一个平面文件。我想将数据迁移到我的新面向,面向对象,基于hibernate的wonder-app。
数据以XML文件的形式提供,我想映射到三个独立的java pojos。我计划使用JAXB来执行此操作,特别是使用@xmlelement
注释。然而,XML文件的结构并不是最优的,在我的pojos中,我将数据分成三个不同的对象。
JAXB会帮助解决这个问题吗?我是否需要使用jaxb简单地基于现有的schema / xml文件(不是oo)创建java pojo。然后创建apdater类/层将数据放入我的三个pojos中?或者我可以直接从xml文件映射到具有正确配置/注释的3个pojos吗?
答案 0 :(得分:4)
注意:我是EclipseLink JAXB (MOXy)主管,是JAXB 2 (JSR-222)专家组的成员。
假设您的XML文档如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<rows>
<row>
<col1>a1</col1>
<col2>b1</col2>
<col3>c1</col3>
</row>
<row>
<col1>a1</col1>
<col2>b2</col2>
<col3>c2</col3>
</row>
</rows>
您可以利用MOXy的@XmlPath注释并执行类似的操作。 EclipseLink还包括JPA implementation:
<强>行强>
您需要创建一个Root对象来保存所有内容:
package forum8577359;
import java.util.List;
import javax.xml.bind.annotation.*;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Rows {
@XmlElement(name="row")
private List<A> rows;
}
<强> A 强>
由于A
,B
和C
对象的内容都在同一级别,因此您可以使用MOXy的@XmlPath
注释并指定{{1} XPath。这告诉MOXy对象及其引用的对象发生在同一级别:
"."
<强>乙强>
我们再次使用package forum8577359;
import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlPath;
@XmlAccessorType(XmlAccessType.FIELD)
public class A {
private String col1;
@XmlPath(".")
private B b;
}
来映射@XmlPath(".")
和B
之间的关系:
C
<强> C 强>
package forum8577359;
import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlPath;
@XmlAccessorType(XmlAccessType.FIELD)
public class B {
private String col2;
@XmlPath(".")
private C c;
}
<强>演示强>
以下演示代码可用于运行此示例:
package forum8577359;
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
public class C {
private String col3;
}
的 jaxb.properties 强>
要将MOXy指定为JAXB提供程序,您需要在与域类相同的程序包中包含package forum8577359;
import java.io.File;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Rows.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum8577359/input.xml");
Rows rows = (Rows) unmarshaller.unmarshal(xml);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(rows, System.out);
}
}
文件,并带有以下条目:
jaxb.properties
了解更多信息
答案 1 :(得分:1)
在不知道问题的具体细节的情况下......它应该是可能的,但听起来这可能是您想要编写模式的情况,使用xjc来生成绑定对象,解组生成绑定对象,然后转换为java中的域对象(如果适用,则直接使用生成的对象)。
答案 2 :(得分:1)
通常JAXB有帮助。即使你手动编写类和注释,我认为它比使用DOM API解析花费的时间更少。
此外,您可以使用JAXB自动生成值对象。我认为这是你应该尝试的方法。首先,您应该从XML生成XSD文件(除非您已经有了)。然后,您应该基于XSD生成值对象。然后只需解析文件。 2个代码行,你就完成了。