首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果元素相同但元素值不同,则使用jaxb解组xml

如果元素相同但元素值不同,则使用jaxb解组xml
EN

Stack Overflow用户
提问于 2016-06-02 23:07:56
回答 1查看 827关注 0票数 0

您好,帮助请在xml文件中有一些相同的元素,这些元素在"name“属性的内容上有所不同。这些元素有不同的项集,如何进行解组?Xml:

代码语言:javascript
复制
        <?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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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;
    }
}

演示:

代码语言:javascript
复制
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());
    }
}

错误:

代码语言:javascript
复制
Exception in thread "main" java.lang.NullPointerException
    at jax.Jax.shouldUnmarshallAdapter(Jax.java:39)
    at jax.Jax.main(Jax.java:31)
EN

回答 1

Stack Overflow用户

发布于 2016-06-02 23:38:55

XML中的标记名"adapter“在Java类中没有等效项,即没有具有该名称的类" Adapters”的成员,因此实际上带有该标记的所有XML都将被忽略,因此Adapters实例中的变量cdb为null。NPE。并且: XML中的属性"name“决不会被Jaxb用来将所有子标记映射到cdb或fmssSc成员。您的Java代码将映射到该结构的XML:

代码语言:javascript
复制
<service-Broker>
   <adapters>
      <cdb>
        <protocol>
        <datasource>
      <fmssSc>
        <protocol>
        ....
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37595635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档