2011-05-12 19 views
6

Java JAXB kullanarak aşağıdaki gibi XML serisini istiyorum İç metnini almak için bir @XmlValue ve iç metinden sonra gelen foo öğelerini almak için @XmlElement. Bu "karma mod içeriği" denirİç Metin ve alt öğeler

import java.io.ByteArrayInputStream; 
import java.io.UnsupportedEncodingException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 
import javax.xml.bind.Unmarshaller; 
import javax.xml.bind.annotation.XmlAttribute; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlValue; 
import javax.xml.stream.XMLEventReader; 
import javax.xml.stream.XMLInputFactory; 
import javax.xml.stream.XMLStreamException; 
import javax.xml.stream.events.XMLEvent; 

public class App { 

    private static final String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><root><container>text<foo attrib=\"meh\"><bar>waffles</bar></foo></container></root>"; 

    @XmlRootElement(name = "foo") static class Foo { 
     @XmlAttribute public String attrib; 
     @XmlElement public String bar; 
    } 

    @XmlRootElement(name = "container") static class Container { 
     //@XmlValue public String innerText; 
     @XmlElement public Foo foo; 
    } 

    public static void main(String[] args) { 
     try { 
      final XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance(); 
      final XMLEventReader xer = xmlInputFactory.createXMLEventReader(new ByteArrayInputStream(xml.getBytes("UTF-8"))); 

      XMLEvent evt = xer.nextEvent(); // start document 
      evt = xer.nextEvent(); // <root> 
      evt = xer.peek(); // advance to <container> 

      JAXBContext ctx = JAXBContext.newInstance(Container.class); 
      Unmarshaller um = ctx.createUnmarshaller(); 
      Object o = um.unmarshal(xer); 
     } catch (UnsupportedEncodingException ex) { 
      Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (XMLStreamException ex) { 
      Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (JAXBException ex) { 
      Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 

cevap

4

yapmak ı arıyorum ne bir taslak için aşağıya bakın ve genellikle sürecine tam bir baş belası var.

JAXB'deki anahtar @XmlMixed ek açıklamasını kullanmaktır - bkz. javadoc. Böyle

deneyin şey:

@XmlRootElement(name = "container") 
static class Container { 
    @XmlMixed 
    @XmlElementRefs({ 
      @XmlElementRef(name="foo", type=Foo.class) 
    }) 
    List<?> content; 

    // ... plus the usual getters/setters 
} 

content liste Foo nesneler ve Strings dizisi içermelidir.

+1

Bununla çalışıyorum; public String getInnerText() için { (Object o: this.content) { (o dizenin instanceof) değerini döndürürse o.toString(); } dönüş null; } public Foo getFoo() { için (Object o: this.content) { eğer (o instanceof Foo) geri dönerse (Foo) o; } dönüş null; } Teşekkürler! – rhollencamp

İlgili konular