JAXB:使用给定的XML模式解组XML文件

时间:2011-06-15 21:02:53

标签: jaxb unmarshalling

我有一个XML文件,其xml架构中包含了一对complexType。所以当我解组xml文件时,我想给xml解析器my xml schema。是否可以这样做,如果是的话,那该怎么做呢?

编辑:在我unmarshal之后,我的对象中的每个字段都为空。知道为什么吗?

1 个答案:

答案 0 :(得分:1)

<强>更新

您看到的问题是由于内容嵌套在NameAndAddress元素中。你可以介绍一个NameAndAddress类让PackageLabel持有一个实例。

<强> PackageLabel

import java.io.Serializable;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="PackageLabel")
@XmlAccessorType(XmlAccessType.FIELD)
public class PackageLabel implements Serializable {

    @XmlElement(name="NameAndAddress")
    private NameAndAddress nameAndAddress;

}

<强> NameAndAddress

import javax.xml.bind.annotation.XmlElement;

public class NameAndAddress {

    @XmlElement(name="Name")
    private String name;

    @XmlElement(name="Address1")
    private String address1;

    @XmlElement(name="Address2")
    private String address2;

    @XmlElement(name="City")
    private String city;

    @XmlElement(name="State")
    private String state;

    @XmlElement(name="ZipCode")
    private String zipCode;

}

EclipseLink JAXB(MOXy)的@XmlPath扩展

或者,您可以使用EclipseLink JAXB (MOXy)中的@XmlPath扩展程序:

import java.io.Serializable;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement(name="PackageLabel")
@XmlAccessorType(XmlAccessType.FIELD)
public class PackageLabel implements Serializable {

    @XmlPath("NameAndAddress/Name/text()")
    private String name;

    @XmlPath("NameAndAddress/Address1/text()")
    private String address1;

    @XmlPath("NameAndAddress/Address2/text()")
    private String address2;

    @XmlPath("NameAndAddress/City/text()")
    private String city;

    @XmlPath("NameAndAddress/State/text()")
    private String state;

    @XmlPath("NameAndAddress/ZipCode/text()")
    private String zipCode;

}

了解更多信息


您可以在Unmarshaller的实例上设置XML架构。这将导致JAXB在将XML转换为对象时验证输入:

如果要从XML模式生成对象模型,还可以使用JAXB来执行此操作: