带有nillable root的JAXB

时间:2016-12-16 23:31:16

标签: java xml xsd jaxb xjc

我有一个无法修改的简单XSD(由第三方提供)。我正在尝试使用XJC为XSD生成java类。非常简化的XSD是:

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="receive" nillable=true />
</xs:schema> 

我想将一个对象编组为XML,因此该元素设置为nil。当我使用XJC生成java类时,我得到一个ObjectFactory方法JAXBElement<Object> createReceive(Object)。但是,没有@XmlElementRoot注释。我看到this question and answer,但我也无法访问第三方插件。是否有可能通过绑定或任何其他本机解决方案解决方案?

1 个答案:

答案 0 :(得分:1)

弄清楚这比我制作它要容易得多,或者比链接的问题暗示的要容易得多。我被挂在了没有@XmlElementRoot的事实上,但事实证明这是不必要的。

simple.xsd

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="receive" nillable="true" />
</xs:schema>

在命令行上,运行生成.../jdk1.8/bin/xjc simple.xsd的{​​{1}}。 ObjectFactory中的一种方法具有签名ObjectFactory

创建了以下实现代码:

public JAXBElement<Object> createReceive(Object value)

根据需要生成以下输出:

package aTest;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

import generated.ObjectFactory;

public class start {

  public static void main(final String[] args) {
    final ObjectFactory factory = new ObjectFactory();
    final JAXBElement<Object> element = factory.createReceive(null);

    try {
      final JAXBContext jaxbContext = JAXBContext.newInstance(JAXBElement.class);
      final Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

      jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

      jaxbMarshaller.marshal(element, System.out);
    } catch (final JAXBException e) {
      e.printStackTrace();
    }
  }
}