[英]Unmarshalling xml with jaxb if the elements are the same, but different element values
您好幫助,請在其中包含xml文件中的某些相同元素,這些元素的區別在於“名稱”屬性的內容。 這些元素具有不同的項目集,如何執行元帥? Xml:
<?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>
我需要在Cdb和FmssSc中執行對象2的解組。我的嘗試:常規元素-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)
XML中的標記名“ adapter”在您的Java類中沒有等效項,即,沒有具有該名稱的類“ Adapters”的成員,因此實際上所有帶有該標記的XML都將被忽略,因此Adapters中的變量cdb instance為null,因此.. NPE。 而且:Jaxb絕不會使用XML中的屬性“名稱”將所有子標簽映射到cdb或fmssSc成員。 您的Java代碼將映射到該結構的XML:
<service-Broker>
<adapters>
<cdb>
<protocol>
<datasource>
<fmssSc>
<protocol>
....
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.