使用MOXy读取XML时,如何将字段标记为必需/可选?

时间:2011-08-25 14:58:26

标签: java xml xsd eclipselink moxy

有一个像这样的简单代码:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
class A {
  @XmlPath("B/text()")
  private String b;

  @XmlPath("C/text()")
  private Integer c;
  ...
}

只要我的XML中有apt值,它就可以正常工作。我想根据需要标记字段c,因此每当我尝试读取c未设置或无效的文档时,都会抛出MOXy。什么是最简单的解决方案?

更新

也可以设置默认值。

1 个答案:

答案 0 :(得分:1)

EclipseLink JAXB (MOXy)或任何JAXB实现都不会对丢失的节点执行设置操作,因此您可以执行以下操作:

选项#1 - 默认字段值

import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
class A {
  @XmlPath("B/text()")
  private String b = "fieldDefault";

  @XmlPath("C/text()")
  private Integer c;
}

使用以下演示代码:

import java.io.StringReader;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(A.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        A a = (A) unmarshaller.unmarshal(new StringReader("<a/>"));

        System.out.println(a.getB());
        System.out.println(a.getC());
    }

}

将产生以下输出:

fieldDefault
null

选项#2 - 在@XmlElement

上指定defaultValue

您可以在@XmlElement注释上指定defaultValue,但这只会在取消编组空元素时设置defaultValue。

import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
class A {
  @XmlPath("B/text()")
  @XmlElement(defaultValue="annotationDefault")
  private String b;

  @XmlPath("C/text()")
  @XmlElement(defaultValue="annotationDefault")
  private Integer c;

}

使用以下演示代码:

import java.io.StringReader;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(A.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        A a = (A) unmarshaller.unmarshal(new StringReader("<a><B/></a>"));

        System.out.println(a.getB());
        System.out.println(a.getC());
    }

}

将产生以下输出:

annotationDefault
null

选项#3 - 在Unmarshaller上指定XML架构以强制验证

使用MOXy或任何JAXB实现,您可以在Unmarshaller上设置XML模式以验证输入: