无法使用Java中的Jaxb仅提取选定的标记值

时间:2017-09-28 06:17:19

标签: java xml jaxb unmarshalling

我有一个非常大的XML字符串。我在这里只发布了XML对象的一部分。我正在尝试将此XML转换为Java对象。我的第一个问题是,我是否需要创建总XML标记值的Java对象,还是可以创建仅选定内部XML对象的Java对象?请找到我的XML字符串。

<DATAPACKET REQUEST-ID = "2">
<HEADER>
    <RESPONSE-TYPE CODE="1" DESCRIPTION="Response DataPacket"/>
    <SEARCH-RESULT-LIST>
        <SEARCH-RESULT-ITEM>
            <NAME MATCHED="TRUE"/>              
        </SEARCH-RESULT-ITEM>
    </SEARCH-RESULT-LIST>
</HEADER>
<BODY>
    <CONS_SCORE>
        <SCORE>0</SCORE>
        <REASON1>
            <HEADER></HEADER>
            <DESCRIPTION></DESCRIPTION>
        </REASON1>
        <REASON2>
            <HEADER></HEADER>
            <DESCRIPTION></DESCRIPTION>
        </REASON2>
        <REASON3>
            <HEADER></HEADER>
            <DESCRIPTION></DESCRIPTION>
        </REASON3>
        <REASON4>
            <HEADER></HEADER>
            <DESCRIPTION></DESCRIPTION>
        </REASON4>
    </CONS_SCORE>
    <CONSUMER_PROFILE2>
        <CONSUMER_DETAILS2>
            <RUID>1234</RUID>
            <NAME>ABC</NAME>
            <DATE_OF_BIRTH>1980-03-03T00:00:00+03:00</DATE_OF_BIRTH>
            <GENDER>001</GENDER>                
        </CONSUMER_DETAILS2>
        <ID_DETAILS2>
            <SLNO>1</SLNO>
            <SOURCE_ID>001</SOURCE_ID>
            <ID_VALUE>2806</ID_VALUE>
            <EXP_DATE>2018-07-13T00:00:00+03:00</EXP_DATE>              
        </ID_DETAILS2>
    </CONSUMER_PROFILE2>
    </BODY>
</DATAPACKET>

在上面的对象中,我想只获取CONSUMER_PROFILE2对象。这是我的Dto课程

@XmlRootElement(name = "DATAPACKET")
public class ConsumerProfileDto {

private ConsumerDetailsDto CONSUMER_DETAILS2;

private IdDetailsDto ID_DETAILS2;

public ConsumerDetailsDto getCONSUMER_DETAILS2() {
    return CONSUMER_DETAILS2;
}

public void setCONSUMER_DETAILS2(ConsumerDetailsDto cONSUMER_DETAILS2) {
    CONSUMER_DETAILS2 = cONSUMER_DETAILS2;
}

public IdDetailsDto getID_DETAILS2() {
    return ID_DETAILS2;
}

public void setID_DETAILS2(IdDetailsDto iD_DETAILS2) {
    ID_DETAILS2 = iD_DETAILS2;
}
}

CONSUMER_DETAILS2类

@XmlRootElement(name = "CONSUMER_DETAILS2")
public class ConsumerDetailsDto {

private String NAME;
private String DATE_OF_BIRTH;
private String GENDER;
private String NATIONALITY;
public String getNAME() {
    return NAME;
}
public void setNAME(String nAME) {
    NAME = nAME;
}
public String getDATE_OF_BIRTH() {
    return DATE_OF_BIRTH;
}
public void setDATE_OF_BIRTH(String dATE_OF_BIRTH) {
    DATE_OF_BIRTH = dATE_OF_BIRTH;
}
public String getGENDER() {
    return GENDER;
}
public void setGENDER(String gENDER) {
    GENDER = gENDER;
}
public String getNATIONALITY() {
    return NATIONALITY;
}
public void setNATIONALITY(String nATIONALITY) {
    NATIONALITY = nATIONALITY;
}

这是解组的代码

JAXBContext jaxbContext = JAXBContext.newInstance(ConsumerProfileDto.class);  

    StringReader reader = new StringReader(responseXML);

    Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();  
    ConsumerDetailsDto que= (ConsumerDetailsDto) jaxbUnmarshaller.unmarshal(reader);  

    System.out.println(que.getDATE_OF_BIRTH());  
    System.out.println(que.getGENDER());;
    System.out.println(que.getNAME());

P.S

我使用过DocumentBuilder,我可以使用它来获取值。但是,我想用Jaxb提取。

1 个答案:

答案 0 :(得分:2)

您不能将@cmlRootElement注释为镜像您感兴趣的XML元素的Java类。您必须在Java中将所有XML元素从XML文件(DATAPACKET)中最顶层的元素镜像到您感兴趣的路径中的最低元素(CONSUMER_DETAILS2和ID_DETAILS2),即使您只对其感兴趣其中一些。

我假设运营商对RUID不感兴趣(因为类CONSUMER_DETAILS2不包含此XML元素的字段),并且还不会从此XML加载字段NATIONALITY

如果问题的输入XML位于名为input2.xml的文件中,那么我将拥有以下Java类:

<强> DataPacket

package test;

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

@XmlAccessorType(XmlAccessType.NONE)
class Body {

    @XmlElement(name = "CONSUMER_PROFILE2")
    private ConsumerProfile profile;

    public Body(){}

    public ConsumerProfile getProfile() {
        return profile;
    }

    public void setProfile(ConsumerProfile profile) {
        this.profile = profile;
    }
}

<强>车身

package test;

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

@XmlAccessorType(XmlAccessType.NONE)
public class ConsumerProfile {

    @XmlElement(name = "CONSUMER_DETAILS2")
    private ConsumerDetails CONSUMER_DETAILS2;

    @XmlElement(name = "ID_DETAILS2")
    private IdDetails ID_DETAILS2;

    public ConsumerProfile(){}

    public ConsumerDetails getCONSUMER_DETAILS2() {
        return CONSUMER_DETAILS2;
    }

    public void setCONSUMER_DETAILS2(ConsumerDetails cONSUMER_DETAILS2) {
        CONSUMER_DETAILS2 = cONSUMER_DETAILS2;
    }

    public IdDetails getID_DETAILS2() {
        return ID_DETAILS2;
    }

    public void setID_DETAILS2(IdDetails iD_DETAILS2) {
        ID_DETAILS2 = iD_DETAILS2;
    }
}

<强> ConsumerProfile

package test;

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

@XmlAccessorType(XmlAccessType.NONE)
class ConsumerDetails {

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

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

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

    private String NATIONALITY;

    public ConsumerDetails(){}

    public String getNAME() {
        return NAME;
    }
    public void setNAME(String nAME) {
        NAME = nAME;
    }
    public String getDATE_OF_BIRTH() {
        return DATE_OF_BIRTH;
    }
    public void setDATE_OF_BIRTH(String dATE_OF_BIRTH) {
        DATE_OF_BIRTH = dATE_OF_BIRTH;
    }
    public String getGENDER() {
        return GENDER;
    }
    public void setGENDER(String gENDER) {
        GENDER = gENDER;
    }
    public String getNATIONALITY() {
        return NATIONALITY;
    }
    public void setNATIONALITY(String nATIONALITY) {
        NATIONALITY = nATIONALITY;
    }
}

<强> ConsumerDetails

package test;

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

@XmlAccessorType(XmlAccessType.NONE)
class IdDetails {

    @XmlElement(name="SLNO")
    private int SLNO;

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

    @XmlElement(name="ID_VALUE")
    private int ID_VALUE;

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

    public IdDetails(){}

    public int getSLNO() {
        return SLNO;
    }

    public void setSLNO(int SLNO) {
        this.SLNO = SLNO;
    }

    public String getSOURCE_ID() {
        return SOURCE_ID;
    }

    public void setSOURCE_ID(String SOURCE_ID) {
        this.SOURCE_ID = SOURCE_ID;
    }

    public int getID_VALUE() {
        return ID_VALUE;
    }

    public void setID_VALUE(int ID_VALUE) {
        this.ID_VALUE = ID_VALUE;
    }

    public String getEXP_DATE() {
        return EXP_DATE;
    }

    public void setEXP_DATE(String EXP_DATE) {
        this.EXP_DATE = EXP_DATE;
    }
}

<强> IdDetails

DataPacket
ConsumerProfile
ConsumerDetails
IdDetails

此外,在同一&#34;测试&#34;将jaxb.in​​dex文件打包为:

package test;

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

public class Test {

    public static void main(String[] args) {
        try{
            JAXBContext jc = JAXBContext.newInstance(DataPacket.class);

            Unmarshaller unmarshaller = jc.createUnmarshaller();
            File xml = new File("input2.xml");
            DataPacket dp = (DataPacket) unmarshaller.unmarshal(xml);
            Body body = dp.getBODY();
            ConsumerProfile profile = body.getProfile();
            ConsumerDetails consumerDetail = profile.getCONSUMER_DETAILS2();
            IdDetails idDetails = profile.getID_DETAILS2();
            System.out.println("ConsumerDetails name:"+consumerDetail.getNAME()+
                               " date of birth:"+consumerDetail.getDATE_OF_BIRTH()+
                               " gender:"+consumerDetail.getGENDER()+
                               "IdDetails SLNO:"+idDetails.getSLNO()+
                                " SOURCE_ID:"+idDetails.getSOURCE_ID()+
                                " ID_VALUE:"+idDetails.getID_VALUE()+
                                " EXP_DATE:"+idDetails.getEXP_DATE());
        }
        catch(JAXBException e){
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }
}

然后,在使用此测试类进行测试时:

{{1}}