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

JAXB:用给定的XML模式解组XML文件,jaxb,unmarshalling,Jaxb,Unmarshalling,我有一个XML文件,它的XML模式包含耦合complexType。因此,当我解组xml文件时,我想给xml解析器我的XMLschema。有可能做到吗?如果有,怎么做 编辑:在I解组后,对象中的每个字段都为空。知道为什么吗?更新 您看到的问题是由于内容嵌套在nameanddress元素中。您可以引入一个nameanddress类,让PackageLabel持有该类的一个实例 包装标签 import java.io.Serializable; import javax.xml.bind.annot

我有一个XML文件,它的XML模式包含耦合
complexType
。因此,当我解组xml文件时,我想给xml解析器我的
XMLschema
。有可能做到吗?如果有,怎么做


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

更新

您看到的问题是由于内容嵌套在
nameanddress
元素中。您可以引入一个
nameanddress
类,让
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;

}
姓名和地址

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扩展

或者,您可以在以下位置使用
@XmlPath
扩展名:

了解更多信息


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

如果要从XML模式生成对象模型,还可以使用JAXB来实现:


更新

您看到的问题是由于内容嵌套在
nameanddress
元素中。您可以引入一个
nameanddress
类,让
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;

}
姓名和地址

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扩展

或者,您可以在以下位置使用
@XmlPath
扩展名:

了解更多信息


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

如果要从XML模式生成对象模型,还可以使用JAXB来实现:


@Harry Pham-以下内容可能会有所帮助。如果你不继续,提出一个新问题,我可以帮助你。嗨,我会单独发布这个问题,但与此同时,你能再看看我原来的帖子吗。由于某种原因,在
解组
之后,我的对象中的所有字段都是
空的
。我在我原来的帖子里贴了一些代码。非常感谢你,布莱斯。顺便说一句,你的博客太棒了。@Harry Pham-我已经更新了我对你问题的答案。我很高兴听到你喜欢这个博客:)。你是JAXB团队的开发人员,问这个问题很快。我有JAXB的简单实现。因此,对于给定的XML文件,我解析标记,获取标记名,然后将
set
放在标记名前面,以生成
setter方法
。例如,在解析标记
Name
之后,我将其更改为
setName
,然后使用反射调用
setName
方法,如
method=PackageLabel.class.getDeclaredMethod(methodName,String.class);调用(这个,值)。我知道反思是昂贵的。你会说JAXB正在做类似的事情,还是说JAXB比这优化多了。@Harry Pham-以下内容可能会有所帮助。如果你不继续,提出一个新问题,我可以帮助你。嗨,我会单独发布这个问题,但与此同时,你能再看看我原来的帖子吗。由于某种原因,在
解组
之后,我的对象中的所有字段都是
空的
。我在我原来的帖子里贴了一些代码。非常感谢你,布莱斯。顺便说一句,你的博客太棒了。@Harry Pham-我已经更新了我对你问题的答案。我很高兴听到你喜欢这个博客:)。你是JAXB团队的开发人员,问这个问题很快。我有JAXB的简单实现。因此,对于给定的XML文件,我解析标记,获取标记名,然后将
set
放在标记名前面,以生成
setter方法
。例如,在解析标记
Name
之后,我将其更改为
setName
,然后使用反射调用
setName
方法,如
method=PackageLabel.class.getDeclaredMethod(methodName,String.class);调用(这个,值)。我知道反思是昂贵的。您会说JAXB正在做类似的事情,还是说JAXB比这优化得多。