有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java JAXB从XML中解组空值

我在尝试将值从XML提取到Java时遇到了一些问题。我的XML文件输入示例:

<?xml version="1.0" encoding="UTF-8" ?>
 <TRB_TRX xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<HEADER ReqNotf="N" TransactionCode="L9_BLACKLIST_SET" PublisherApplID="CL" PublisherApplThreadID="1" EntityId="58241962" RoutingId="2626289" EntityType="ACCOUNT" IssueDate="2019-06-18T23:59:59" EffectiveDate="2019-06-18T23:59:59"/>
    <DATA>
        <BlacklistCodeSet>
            <TransactionHeaderInfoExt>
                <ApplicationId>CL</ApplicationId>
                <RequestDate>2019-06-18T23:59:59</RequestDate>
            </TransactionHeaderInfoExt>
            <ClEntityIdInfoExt>
                <EntityId>58241962</EntityId>
                <EntityType>ACCOUNT</EntityType>
            </ClEntityIdInfoExt>
            <GeneralCollectionEntityInfoExt>
                <BlacklistCode>D</BlacklistCode>
            </GeneralCollectionEntityInfoExt>
        </BlacklistCodeSet>
    </DATA>
</TRB_TRX>

XML文件的我的Java类:

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

@XmlRootElement(name="BlacklistCodeSet")
public class BlackListCode {
    String entityId;
String blackListCode;

public String getEntityId() {
    return entityId;
}

public void setEntityId(String entityId) {
    this.entityId = entityId;
}

public String getBlackListCode() {
    return blackListCode;
}

public void setBlackListCode(String blackListCode) {
    this.blackListCode = blackListCode;
}

@Override
public String toString() {
    return "BlackListCode{" +
            "entityId='" + entityId + '\'' +
            ", blackListCode='" + blackListCode + '\'' +
            '}';
}
}

我的代码用于提取值:

XMLInputFactory xif = XMLInputFactory.newFactory();

                FileReader reader = new FileReader("src/main/resources/xml/blacklistcode.xml");
                XMLStreamReader xsr = xif.createXMLStreamReader(reader);

                try {
                    JAXBContext jc = JAXBContext.newInstance(BlackListCode.class);
                    Unmarshaller unmarshaller = jc.createUnmarshaller();

                    while (xsr.hasNext()) {
                        while (xsr.hasNext() && (!xsr.isStartElement() || !xsr.getLocalName().equals("BlacklistCodeSet"))) {
                            xsr.next();
                        }
                        if (xsr.hasNext()) {
                            BlackListCode blacklistcode = (BlackListCode) unmarshaller.unmarshal(xsr);
                            log.debug("BLACKLIST CODE IS " + blacklistcode);
                            log.debug("ACCOUNT NO IS " + blacklistcode.getEntityId());
                        }
                    }
                }catch (Exception e){
                    e.printStackTrace();
                }

在提取值之前,我尝试循环节点,直到它与“BlacklistCodeSet”匹配。但是,打印出来的值为空,并且没有抛出错误消息

有什么想法吗?谢谢


共 (1) 个答案

  1. # 1 楼答案

    为了让JAXB在此时解析到该类中,<BlacklistCodeSet>的XML必须是:

    <BlacklistCodeSet>
        <blackListCode>D</blackListCode>
        <entityId>58241962</entityId>
    </BlacklistCodeSet>
    

    如果创建BlackListCode的实例并使用JAXB将其转换为XML,您自己就可以看到这一点。这是“调试”JAXB的最佳方式

    BlackListCode blackListCode = new BlackListCode();
    blackListCode.setEntityId("58241962");
    blackListCode.setBlackListCode("D");
    
    JAXBContext jaxbContext = JAXBContext.newInstance(BlackListCode.class);
    Marshaller marshaller = jaxbContext.createMarshaller();
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    marshaller.marshal(blackListCode, System.out);
    

    如您所见,JAXB所需的XML与您提供给JAXB的实际XML有很大不同。这些元素甚至都没有正确命名,以小写字母开头,因此需要指定@XmlElement注释来正确命名它们,并且需要额外的对象来获得更复杂的XML

    @XmlRootElement(name = "BlacklistCodeSet")
    class BlackListCode {
        private ClEntityIdInfoExt clEntityIdInfoExt;
        private GeneralCollectionEntityInfoExt generalCollectionEntityInfoExt;
    
        @XmlElement(name = "ClEntityIdInfoExt")
        public ClEntityIdInfoExt getClEntityIdInfoExt() {
            return this.clEntityIdInfoExt;
        }
    
        public void setClEntityIdInfoExt(ClEntityIdInfoExt clEntityIdInfoExt) {
            this.clEntityIdInfoExt = clEntityIdInfoExt;
        }
    
        @XmlElement(name = "GeneralCollectionEntityInfoExt")
        public GeneralCollectionEntityInfoExt getGeneralCollectionEntityInfoExt() {
            return this.generalCollectionEntityInfoExt;
        }
    
        public void setGeneralCollectionEntityInfoExt(GeneralCollectionEntityInfoExt generalCollectionEntityInfoExt) {
            this.generalCollectionEntityInfoExt = generalCollectionEntityInfoExt;
        }
    
        @Override
        public String toString() {
            return "BlackListCode{entityId='" + this.clEntityIdInfoExt.getEntityId() + '\'' +
                               ", BlacklistCode='" + this.generalCollectionEntityInfoExt.getBlacklistCode() + '\'' + '}';
        }
    }
    
    class ClEntityIdInfoExt {
        private String entityId;
    
        public ClEntityIdInfoExt() {
        }
    
        public ClEntityIdInfoExt(String entityId) {
            this.entityId = entityId;
        }
    
        @XmlElement(name = "EntityId")
        public String getEntityId() {
            return this.entityId;
        }
    
        public void setEntityId(String entityId) {
            this.entityId = entityId;
        }
    }
    
    class GeneralCollectionEntityInfoExt {
        private String BlacklistCode;
    
        public GeneralCollectionEntityInfoExt() {
        }
    
        public GeneralCollectionEntityInfoExt(String blacklistCode) {
            this.BlacklistCode = blacklistCode;
        }
    
        @XmlElement(name = "BlacklistCode")
        public String getBlacklistCode() {
            return this.BlacklistCode;
        }
    
        public void setBlacklistCode(String blacklistCode) {
            this.BlacklistCode = blacklistCode;
        }
    }
    

    测试

    BlackListCode blackListCode = new BlackListCode();
    blackListCode.setClEntityIdInfoExt(new ClEntityIdInfoExt("58241962"));
    blackListCode.setGeneralCollectionEntityInfoExt(new GeneralCollectionEntityInfoExt("D"));
    
    JAXBContext jaxbContext = JAXBContext.newInstance(BlackListCode.class);
    Marshaller marshaller = jaxbContext.createMarshaller();
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    marshaller.marshal(blackListCode, System.out);
    

    输出

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <BlacklistCodeSet>
        <ClEntityIdInfoExt>
            <EntityId>58241962</EntityId>
        </ClEntityIdInfoExt>
        <GeneralCollectionEntityInfoExt>
            <BlacklistCode>D</BlacklistCode>
        </GeneralCollectionEntityInfoExt>
    </BlacklistCodeSet>
    

    既然生成的XML与预期的XML匹配,JAXB就可以正确地将XML解组到对象中