2016-06-02 2 views
0

Здравствуйте, пожалуйста, приложите xml-файл к нему из одних и тех же элементов, элементы отличаются содержанием атрибута «name». Эти элементы имеют разные наборы элементов, как выполнять немаршалирование? Xml:Unmarshalling xml с jaxb, если элементы одинаковые, но разные значения элементов

 <?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?> 
     <service-broker> 
      <adapters> 
       <adapter name=\"cdb\"> 
         <protocol>JDBC</protocol> 
         <datasource>CdbAdapterDS</datasource> 
       </adapter> 

       <adapter name=\"fmss-sc\"> 
        <protocol>BBBC</protocol> 
        <fleet-uc18-reason-codes> 
          <code>2</code> 
          <code>3</code> 
        </fleet-uc18-reason-codes> 
       </adapter> 
      </adapters> 
     </service-broker> 

Мне нужно выполнить демаршаллинг объекта 2 в CDB и FmssSc Мои попытки: Генеральный элемент - ServiceBroker.class

package jax; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement(name = "service-broker") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class ServiceBroker { 

    @XmlElement(name = "adapters") 
    private Adapters adapters; 

    public Adapters getAdapters() { 
     return adapters; 
    } 

    public void setAdapters(Adapters adapters) { 
     this.adapters = adapters; 
    } 
} 

Adapters.class

package jax; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlElementWrapper; 

@XmlAccessorType(XmlAccessType.FIELD) 
class Adapters { 

    @XmlElement 
    private Cdb cdb; 

    @XmlElement 
    private FmssSc fmssSc; 

    public Cdb getCdb() { 
     return cdb; 
    } 

    public void setCdb(Cdb cdb) { 
     this.cdb = cdb; 
    } 

    public FmssSc getFmssSc() { 
     return fmssSc; 
    } 

    public void setFmssSc(FmssSc fmssSc) { 
     this.fmssSc = fmssSc; 
    } 
} 

Cdb.class

package jax; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 

@XmlAccessorType(XmlAccessType.FIELD) 
class Cdb { 

    @XmlElement(name = "protocol") 
    private String protocol; 

    @XmlElement(name = "datasource") 
    private String datasource; 

    public String getProtocol() { 
     return protocol; 
    } 

    public void setProtocol(String protocol) { 
     this.protocol = protocol; 
    } 

    public String getDatasource() { 
     return datasource; 
    } 

    public void setDatasource(String datasource) { 
     this.datasource = datasource; 
    } 
} 

FmssSc.class

package jax; 

import java.util.ArrayList; 
import java.util.List; 
import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlElementWrapper; 

@XmlAccessorType(XmlAccessType.FIELD) 
class FmssSc { 

    @XmlElement(name = "protocol") 
    private String protocol; 

    @XmlElementWrapper(name = "fleet-uc18-reason-codes") 
    @XmlElement(name = "code") 
    private List<String> code = new ArrayList<>(); 

    public String getProtocol() { 
     return protocol; 
    } 

    public void setProtocol(String protocol) { 
     this.protocol = protocol; 
    } 

    public List<String> getCode() { 
     return code; 
    } 

    public void setCode(List<String> code) { 
     this.code = code; 
    } 
} 

Демо:

package jax; 

import java.io.StringReader; 
import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 
import javax.xml.bind.Unmarshaller; 

public class Jax { 

    public static final String adapter = 
      "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + 
      "<service-broker>" + 
       "<adapters>" + 
        "<adapter name=\"cdb\">" + 
          "<protocol>JDBC</protocol>" + 
          "<datasource>CdbAdapterDS</datasource>" + 
        "</adapter>" + 

        "<adapter name=\"fmss-sc\">" + 
         "<protocol>BBBC</protocol>" + 
         "<fleet-uc18-reason-codes>" + 
           "<code>2</code>" + 
           "<code>3</code>" + 
         "</fleet-uc18-reason-codes>" + 
        "</adapter>" + 
       "</adapters>" + 
      "</service-broker>"; 

    public static void main(String[] args) throws JAXBException { 
     Jax jax = new Jax(); 
     jax.shouldUnmarshallAdapter(); 
    } 

    public void shouldUnmarshallAdapter() throws JAXBException { 
     StringReader reader = new StringReader(adapter); 
     JAXBContext context = JAXBContext.newInstance(ServiceBroker.class); 
     Unmarshaller u = context.createUnmarshaller(); 
     ServiceBroker sb = (ServiceBroker) u.unmarshal(reader); 
     System.out.println(sb.getAdapters().getCdb().getProtocol()); 
    } 
} 

Ошибка:

Exception in thread "main" java.lang.NullPointerException 
    at jax.Jax.shouldUnmarshallAdapter(Jax.java:39) 
    at jax.Jax.main(Jax.java:31) 
+0

Возможного дубликат [JAXB - немаршалинг полиморфных объектов] (http://stackoverflow.com/q/5491982/5221149) или [Java/JAXB: маршализация Xml для конкретного подкласса на основе атрибута] (http://stackoverflow.com/q/2992234/5221149). Дополнительные сведения см. В разделе google ['jaxb unmarshal subclass from attribute'] (https://www.google.com/#q=jaxb+unmarshal+subclass+from+attribute). – Andreas

ответ

0

Тэг "адаптер" в XML не имеет аналогов в ваших Java-классов, т.е. есть нет члена класса «Адаптеры» с этим именем, поэтому на самом деле весь XML с этим тегом будет проигнорирован, поэтому переменная cdb в экземпляре Adapters равна null, поэтому .. NP E. И: Атрибут «имя» в вашем XML не будет использоваться Jaxb для сопоставления всех подтег либо с членом cdb, либо с fmssSc. Ваш код Java будет отображаться в качестве XML этой структуры:

<service-Broker> 
    <adapters> 
     <cdb> 
     <protocol> 
     <datasource> 
     <fmssSc> 
     <protocol> 
     .... 
+0

Спасибо за комментарий, но как снять этот xml? –