JAXB:使用QName解组消息?

时间:2010-08-24 15:27:26

标签: jaxb

如何解组使用与预期不同的QName本地部分编组的消息?

我的例子如下:

给定一个使用编组方法(例如

)创建的解组的对象
     marshaller.marshal( new JAXBElement(
                        new QName("urn:somenamespace","DifferentNameMessage"), 
                        OriginalMessageType.class, 
                        originalMsg), 
                   result);

(据我理解这段代码片段,QName指示使根元素使用除指定之外的替代名称标记 在原始架构中。基本上使用替代名称方法。例如,在原始的QName之上 tag应该是“NameMessage”,但邮件是使用本地部分“DifferentNameMessage”编组的。)

我通常会使用一种解组方法,例如:

     String xmlString = convertStreamToString(in);
     final StringReader xmlReader = new StringReader(xmlString);
     final StreamSource xmlSource = new StreamSource(xmlReader);         

     JAXBContext jaxbContext = JAXBContext.newInstance(OriginalMessageType.class);
     Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
     JAXBElement ret = null;
     ret = unmarshaller.unmarshal(xmlSource, OriginalMessageType.class);

但是,如果我使用此方法,那么JAXBElement ret名称用于编组它的QName,但是DeclaredType用于 尽管如此,OriginalMessageType.class和unmarshalled消息包含预期子元素的空元素值 原始邮件包含这些子元素的有效值。

我想知道是否有可能在解组时指定替代QName以表明它是替代品然后在其位置使用原始标签?

1 个答案:

答案 0 :(得分:1)

以下是正确的:

ret = unmarshaller.unmarshal(xmlSource, OriginalMessageType.class); 

这是你在编组时制作JAXBContext的方式吗?

JAXBContext jaxbContext = JAXBContext.newInstance(OriginalMessageType.class);  

要尝试的事情:

  1. 您是否验证了编组文档是否正确?
  2. 当你为marshal和unmarshal使用相同的JAXBContext时会发生什么?