您好,帮助请在xml文件中有一些相同的元素,这些元素在"name“属性的内容上有所不同。这些元素有不同的项集,如何进行解组?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中执行对象2的解组,并对我的尝试进行FmssSc : General element - 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)发布于 2016-06-02 23:38:55
XML中的标记名"adapter“在Java类中没有等效项,即没有具有该名称的类" Adapters”的成员,因此实际上带有该标记的所有XML都将被忽略,因此Adapters实例中的变量cdb为null。NPE。并且: XML中的属性"name“决不会被Jaxb用来将所有子标记映射到cdb或fmssSc成员。您的Java代码将映射到该结构的XML:
<service-Broker>
<adapters>
<cdb>
<protocol>
<datasource>
<fmssSc>
<protocol>
....https://stackoverflow.com/questions/37595635
复制相似问题