2017-01-09 13 views
3

Я не могу достичь unmarshall XML без знания элемента root. например.Jaxb Unmarshall с неизвестным @XmlRootElement

<foo> 
    <bar/> 
</foo> 

или

<bar> 
    <bar/> 
</bar> 

и т.д ...

Я хочу, чтобы отобразить немаршалинг результат на классе, как:

// @XmlRootElement ?? 
public class Container 
    implements Serializable 
{ 
    private Bar bar; 
} 

Я всегда требуется, чтобы исправить @XmlRootElement ,
Я искал, как установить @XmlRootElement во время выполнения без успеха. Есть идеи?

Я весенний пакетный контекст, и я могу использовать unmarshaller по своему выбору.

Примечание: Я не могу использовать @XmlElementDecl или ObjectFactory, как показано here потому я не знаю имя из корневых имен-плюсом.

+0

Что вы ожидаете стать конечным результатом вашего развязывания? –

+0

Спасибо за ответ, я отредактировал вопрос. –

+0

Возможный дубликат [Может ли JAXB обрабатывать несколько «корневых» элементов?] (Http://stackoverflow.com/questions/12915968/can-jaxb-handle-multiple-root-elements) – ulab

ответ

2

адаптированный свой подход: https://stackoverflow.com/a/33824472/181336

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBElement; 
import javax.xml.bind.Unmarshaller; 
import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.transform.stream.StreamSource; 
import java.io.ByteArrayInputStream; 
import java.io.InputStream; 
import java.io.Serializable; 

public class Test { 

    @XmlAccessorType(XmlAccessType.PROPERTY) 
    public static class Bar { 
     private String name; 

     public String getName() { 
      return name; 
     } 

     @XmlElement 
     public void setName(String name) { 
      this.name = name; 
     } 
    } 

    @XmlAccessorType(XmlAccessType.PROPERTY) 
    public static class Container implements Serializable { 
     private Bar bar; 

     public Bar getBar() { 
      return bar; 
     } 

     @XmlElement 
     public void setBar(Bar bar) { 
      this.bar = bar; 
     } 
    } 

    public static void main(String[] args) throws Exception { 
     JAXBContext jaxbContext = JAXBContext.newInstance(Container.class); 
     String xml = "<foo><bar><name>Barry</name></bar></foo>"; 
     Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 
     InputStream is = new ByteArrayInputStream(xml.getBytes()); 
     JAXBElement<Container> barWrapperElement = unmarshaller.unmarshal(new StreamSource(is), Container.class); 
     Container container = barWrapperElement.getValue(); 

     System.out.println(container.getBar().getName()); 
    } 
} 

Это работает!

+0

Так вы получили его для работы с несколькими анонимными корневыми элементами? –

+0

Да, спасибо. В весенней партии я параметризировал 'fragmentRootElementName'' StaxEventItemReader', используя [late-binding] (http://stackoverflow.com/a/18693233/3042945). Это 'fragmentRootElementName' является' foo' или 'bar' в моем примере. 'StaxEventItemReader' не заботится о корневом имени документа (например,' root', 'root2'). Я сделаю сообщение с полным решением. –

+1

Это было бы круто! –

0

Какой-либо XML ваш переход действительно есть корневые элементы, XML, которые вы упомянули, есть два файла

<foo> 
    <bar/> 
</foo> 

или

<bar> 
<bar/> 

так вот у вас есть два названия корня Foo или BAR так создать два классы для каждого, если это корневое имя будет называться этим классом

+0

Я не знаю заранее имя корня. Вот почему я не могу создать класс с использованием этого имени. XML, о котором я упоминал, является минималистской версией того, чего я действительно хочу достичь. –

 Смежные вопросы

  • Нет связанных вопросов^_^