JAXB Fragmented Marshalling

Eu estou tendo algum problema com sucesso marshalling usando a propriedade Marshaller.JAXB_FRAGMENT. Aqui está uma versão simples do XML que estou tentando produzir.

     ... .. ...     ...    

Os elementos e são essencialmente apenas elementos de contêiner que incluem um grande número de elementos e . Atualmente estou tentando marshall no .

  1. É possível inicialmente empacotar os elementos e e, em seguida, em seguida, marshal no elemento e ter a saída ser delimitada nas marcas ?
  2. Quando estou empacotando no nível do WorkSet, ele anexa o atributo xmlns='http://namespace.com' à marca WorkSet, existe uma maneira de empacotar sem o atributo namespace ser anexado ao Workset?

Basicamente, parece que em vez de construir uma tree de objects completa com os objects contêineres, você deseja poder transmitir uma coleção de instâncias do WorkSet para empacotar usando o JAXB.

A abordagem que eu tomaria é usar um XMLStreamWriter e empacotar os objects WorkSet envolvendo-os em um JAXBElement. Eu não testei o código de exemplo por perto, então aqui está o trecho de código que deve colocá-lo na faixa de gravação:

 FileOutputStream fos = new FileOutputStream("foo.xml"); XMLStreamWriter writer = XMLOutputFactory.newFactory().createXMLStreamWriter(fos); writer.writeStartDocument(); writer.writeStartElement("Import"); writer.writeStartElement("WorkSets"); JAXBContext context = JAXBContext.newInstance(WorkSet.class); Marshaller m = context.createMarshaller(); m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); for (WorkSet instance : instances) { JAXBElement element = new JAXBElement(QName.valueOf("WorkSet"), WorkSet.class, instance); m.marshal(element, writer); } writer.writeEndDocument(); // this will close any open tags writer.close(); 

Nota: O acima é completamente não testado e pode estar bagunçando algo na parte de quebra automática para escrever cada instância do WorkSet. Você precisa agrupar as instâncias do WorkSet porque elas não serão anotadas com @XmlRootElement e o JAXB recusará, de outra forma, empacotar os objects.

Uma outra abordagem pode ser apenas envolver o xml recebido com os elementos necessários para criar um elemento raiz. Então pegue o object Java para o elemento raiz e chame o getter para o fragment que você está procurando.

Por exemplo, se você tivesse o xml assim:

   This is the foo value This is the bar value   

E você foi entregue isso:

  This is the foo value This is the bar value  

Você poderia agrupar a string com as tags XmlRootElement e, em seguida, analisar a string resultante no object raiz e obter o object fragmentado a partir dela. Algo como:

 public FragementElement getFragmentElement(String xml) { xml = "" + xml + ""; ByteArrayInputStream is = new ByteArrayInputStream(xml.getBytes()); JAXBElement obj = (JAXBElement) unmarshaller.unmarshal(is); XmlRootElement xmlRootElement = (XmlRootElement) obj.getValue(); FragementElement fragmentElement = xmlRootElement.getText(); return fragmentElement; }