仅JAXB XML编组对象,但解组需要完整结构?

时间:2012-01-18 15:59:20

标签: xml jaxb marshalling

我使用标准的JAXB API来处理XML。我需要编组然后取消编组一个对象(因此结果应该是同一个对象)。我首先编组成一个字符串,然后执行相反的操作 - 从字符串解组为对象。

问题是Marshaller.marshal(obj,os)只给我孩子(用XML括起来)。当我尝试解组时,我收到了关于缺少父标记的错误。

E.g。 (1)对象“FieldSet”的Marshalled String:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<FIELD1>field1</FIELD1>
<FIELD2>field2</FIELD2>

(2)尝试将此XML字符串解组为“FieldSet”对象:

javax.xml.bind.UnmarshalException:不允许使用标记名“FIELD1”。可能的标签名称是:   - 链接异常: [com.sun.msv.verifier.ValidityViolation:标签名称“FIELD1”不允许。可能的标签名称为:“Parent”]

在架构中,“Parent”是应位于“FieldSet”之前的顶级元素。

为什么这些标准的JAXB操作不对称,我需要做什么来同步它们并避免仅限子/丢失的父问题?感谢。

1 个答案:

答案 0 :(得分:0)

要提供根元素信息,您可以执行以下操作之一:

1 - 使用@XmlRootElement

注释要注释的班级
@XmlRootElement
public class FieldSet {
}

2 - 使用JAXBElement

的实例包裹您正在编组的对象
QName qName = new QName("root");
JAXBElement<FieldSet> jaxbElement = new JAXBElement<FieldSet>(qName, FieldSet.class, fieldSet);