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

无法在Java中使用Jaxb仅提取选定的标记值,java,xml,jaxb,unmarshalling,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"/> <SEARC

我有一个非常大的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>
消费者详细信息2类 这是解组的代码

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());
附笔
我使用过DocumentBuilder,并且能够使用它获取值。但是,我想使用Jaxb进行提取

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

我假设操作员对RUID不感兴趣(因为类CONSUMER_DETAILS2不包含此XML元素的字段),并且字段国籍不会从此XML加载

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

数据包

package test;

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

@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement(name = "DATAPACKET")
public class DataPacket {

    @XmlAttribute(name = "REQUEST_ID")
    private int REQUEST_ID;

    @XmlElement(name ="BODY")
    private Body BODY;

    public DataPacket(){}

    public int getREQUEST_ID() {
        return REQUEST_ID;
    }

    public void setREQUEST_ID(int REQUEST_ID) {
        this.REQUEST_ID = REQUEST_ID;
    }

    public Body getBODY() {
        return BODY;
    }

    public void setBODY(Body BODY) {
        this.BODY = BODY;
    }
}
身体

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;
    }
}
消费者详细信息

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;
    }
}
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

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;
    }
}
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;
    }
}
此外,在同一“测试”包中,jaxb.index文件包含:

DataPacket
ConsumerProfile
ConsumerDetails
IdDetails
然后,当使用该测试类进行测试时:

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();
        }
    }
}

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

我假设操作员对RUID不感兴趣(因为类CONSUMER_DETAILS2不包含此XML元素的字段),并且字段国籍不会从此XML加载

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

数据包

package test;

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

@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement(name = "DATAPACKET")
public class DataPacket {

    @XmlAttribute(name = "REQUEST_ID")
    private int REQUEST_ID;

    @XmlElement(name ="BODY")
    private Body BODY;

    public DataPacket(){}

    public int getREQUEST_ID() {
        return REQUEST_ID;
    }

    public void setREQUEST_ID(int REQUEST_ID) {
        this.REQUEST_ID = REQUEST_ID;
    }

    public Body getBODY() {
        return BODY;
    }

    public void setBODY(Body BODY) {
        this.BODY = BODY;
    }
}
身体

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;
    }
}
消费者详细信息

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;
    }
}
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

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;
    }
}
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;
    }
}
此外,在同一“测试”包中,jaxb.index文件包含:

DataPacket
ConsumerProfile
ConsumerDetails
IdDetails
然后,当使用该测试类进行测试时:

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();
        }
    }
}

@Guillem.让我检查一下,然后再回到uYou,你太棒了。我已经添加了一个列表。在我的XML411中,我只想得到带有11值的position标签。我可以这样做吗?@vaibhavcool20使用JAXB将加载所有元素。相反,我要实现一个,它记录已经读取了多少元素。@Guillem.让我检查一下,然后返回到uYou,这太棒了。我已经添加了一个列表。在我的XML411中,我只想得到带有11值的position标签。我可以这样做吗?@vaibhavcool20使用JAXB将加载所有元素。相反,我要实现一个记录已经读取了多少元素的函数。