使用XSD中的JAXB生成元素java类

时间:2017-07-21 14:48:52

标签: java xml xsd jaxb

我有一个xsd文档,我想使用JAXB从它生成java类。 之前,有一个这样的元素:

<element name="myResponse" type="param:response>
<complexType name="response">
    <sequence>
        <element maxOccurs="unbounded" minOccurs="0" name="reference" type="param:myType" />
        ...
    </sequence>
</complexType>

和myType也被定义为complexType。 然后我得到生成的类MyResponse.java和Reference.java。 我可以指定&#34;参考&#34;的值由:

ArrayList<myType> l = new new ArrayList<myType>()
response.getReference().addAll(l);

并且有效。

现在我刚删除了maxOccurs =&#34;无界&#34;,它不再起作用了。 响应不再是List类型,而是JAXBElement。 我试着用:

myType t = new myType();
response.getReference().setValue(t);

myType t = new myType();
response.setReference(t);

但不起作用。

有人可以告诉我,当它不是一个清单时,正确的做法是什么?

1 个答案:

答案 0 :(得分:0)

到目前为止我的声誉不够,所以我无法评论问题,因此我将负责猜测你的问题是什么(没有足够的信息来说明你如何设法在java代码中获得“响应”变量) 。我相信这与你的类型接受一系列元素或只接受一个元素无关。

  1. 如果使用xjc工具从模式生成Java类,则最终应生成ObjectFactory.class以及表示类型的其他类。检查一个以了解如何创建对象。

  2. 由于您的响应元素是模式中的顶级元素,因此使用@XmlElementDecl annotation进行注释并具有类型JAXBElement

  3. 您的“响应”从未属于类型列表(请检查生成的类)。它只有一个List<MyType>类型

  4. 的“参考”字段

    因此,如果您从xml文件中解组数据,则应按以下方式执行此操作

    JAXBContext jc = JAXBContext.newInstance(ObjectFactory.class);
    Response response = ((JAXBElement<Response>) jc.createUnmarshaller().unmarshal(new File("YOUR_FILE_PATH"))).getValue();
    MyType t = new ObjectFactory().createMyType();
    response.setReference(t);
    

    这基本上是一种正确的方式(包括使用ObjectFactory.class方法创建新对象)。