将XML文件编组到Java pojo / domain对象

时间:2011-12-20 15:00:13

标签: java xml jaxb marshalling

我有一个旧的Access数据库,基本上是一个平面文件。我想将数据迁移到我的新面向,面向对象,基于hibernate的wonder-app。

数据以XML文件的形式提供,我想映射到三个独立的java pojos。我计划使用JAXB来执行此操作,特别是使用@xmlelement注释。然而,XML文件的结构并不是最优的,在我的pojos中,我将数据分成三个不同的对象。

JAXB会帮助解决这个问题吗?我是否需要使用jaxb简单地基于现有的schema / xml文件(不是oo)创建java pojo。然后创建apdater类/层将数据放入我的三个pojos中?或者我可以直接从xml文件映射到具有正确配置/注释的3个pojos吗?

3 个答案:

答案 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

由于ABC对象的内容都在同一级别,因此您可以使用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个代码行,你就完成了。