我有一个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);
但不起作用。
有人可以告诉我,当它不是一个清单时,正确的做法是什么?
答案 0 :(得分:0)
到目前为止我的声誉不够,所以我无法评论问题,因此我将负责猜测你的问题是什么(没有足够的信息来说明你如何设法在java代码中获得“响应”变量) 。我相信这与你的类型接受一系列元素或只接受一个元素无关。
如果使用xjc工具从模式生成Java类,则最终应生成ObjectFactory.class
以及表示类型的其他类。检查一个以了解如何创建对象。
由于您的响应元素是模式中的顶级元素,因此使用@XmlElementDecl
annotation进行注释并具有类型JAXBElement
您的“响应”从未属于类型列表(请检查生成的类)。它只有一个List<MyType>
类型
因此,如果您从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
方法创建新对象)。