当前位置: 首页 > 知识库问答 >
问题:

JAXB解组问题(获取空列表)

景成和
2023-03-14

我正试图使用JAXB api解析下面的XML文档,我想解析PROPERTYDATALIST中包含多个PROPERTYDATA对象的每个项。在文档解组过程中,我得到一个空列表。任何关于如何解决此问题的帮助都将不胜感激。

<?xml version="1.0" encoding="UTF-8"?>
<FACILITY>
    <ARRANGEMENTACTIVITY>
        <ID>NEW</ID>
        <CUSTOMER>500000030</CUSTOMER>
        <CUSTOMERROLE>OWNER</CUSTOMERROLE>      
        <PROPERTYDATALIST>
            <PROPERTYDATA>
                <PROPERTY>FACOMMITMENT</PROPERTY>
                <AMOUNT>600000</AMOUNT>
                <TERM>5Y</TERM>
                <MATURITYDATE>20261001</MATURITYDATE>
            </PROPERTYDATA>
            <PROPERTYDATA>
                <PROPERTY>PRINCIPALINT</PROPERTY>
                <FIXEDRATE>3.5</FIXEDRATE>
            </PROPERTYDATA>         
        </PROPERTYDATALIST>
    </ARRANGEMENTACTIVITY>
</FACILITY>

下面是我编写的用于解组XML文件的类

@XmlRootElement(name = "FACILITY")
@Data
@NoArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
public class Facility {
    @XmlElement(name = "ARRANGEMENTACTIVITY")
    private ArrangementActivity arrangementActivity;
    
}

@XmlAccessorType(XmlAccessType.NONE)
@XmlType(propOrder = {"id", "customer","propertyDataList", "application", "version", "operation"})
@Data
public class ArrangementActivity {

    @XmlElement(name = "APPLICATION")
    private String application;
    
    @XmlElement(name = "VERSION")
    private String version;
    
    @XmlElement(name = "OPERATION")
    private String operation;
    
    @XmlElement(name = "ID")
    private String id;
    
    @XmlElement(name = "CUSTOMER")
    private String customer;    
    
    @XmlElementWrapper(name = "PROPERTYDATALIST")
    @XmlElement(name = "PROPERTYDATALIST")
    private List<PropertyData> propertyDataList;    
}
@XmlAccessorType(XmlAccessType.NONE)
@Data
@XmlType(propOrder = {"property", "amount", "term", "maturityDate", "fixedRate" })
public class PropertyData {
    
    @XmlElement(name = "PROPERTY")
    private String property;
    
    @XmlElement(name = "AMOUNT")
    private String amount;
    
    @XmlElement(name = "TERM")
    private String term;
    
    @XmlElement(name = "MATURITYDATE")
    private String maturityDate;
    
    @XmlElement(name = "FIXEDRATE")
    private String fixedRate;
        
}
public class JaxbExampleMain {

    public static void main(String[] args) {
    
        String fileSourcePath = // file path";
        try {
            
            File file = new File( fileSourcePath);              
            InputStream inputStream = new FileInputStream(file); 
                
            final XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance().createXMLStreamReader(inputStream);
            final Unmarshaller unmarshaller = JAXBContext.newInstance(Facility.class).createUnmarshaller();
            final Facility facility = unmarshaller.unmarshal(xmlStreamReader, Facility.class).getValue();
            System.out.println(facility.toString());

            Marshaller marshaller = JAXBContext.newInstance(Facility.class).createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            marshaller.marshal(facility, System.out);
            
            
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

通过上面的代码,我得到了除上面PropertyCatalist之外的所有元素。下面是输出


共有1个答案

陆弘光
2023-03-14

我发现您的代码存在一些问题:

>

  • 您已经在java类中添加了多个根元素(ArrangementActive,Property tyData)。应该只有一个根元素(设施)。

    您在proporter中添加了几个属性,您应该包括所有属性,除非其中任何属性被标记为瞬态

    您的XML将字段大写为,但字段是小写的,因此它不能在解组期间直接赋值。您可以使用@XmlElement来指定它在XML中的名称。

    (您要求的)您必须在列表中使用@xmlementwrapperxmlement

    注意:我使用了Project Lombok Getter

    下面是解组和封送XML的代码:

    Facility.class

    @XmlRootElement(name = "FACILITY")
    @Data
    @NoArgsConstructor
    @XmlAccessorType(XmlAccessType.FIELD)
    public class Facility {
    
        @XmlElement(name = "ARRANGEMENTACTIVITY")
        private ArrangementActivity arrangementActivity;
    }
    

    安排活动。班

    @XmlAccessorType(XmlAccessType.NONE)
    @XmlType(propOrder = {"id", "customer","propertyDataList","application","version","operation"})
    @Data
    public class ArrangementActivity {
    
        @XmlElement(name = "APPLICATION")
        private String application;
    
        @XmlElement(name = "VERSION")
        private String version;
    
        @XmlElement(name = "OPERATION")
        private String operation;
    
        @XmlElement(name = "ID")
        private String id;
    
        @XmlElement(name = "CUSTOMER")
        private String customer;
    
        @XmlElementWrapper(name = "PROPERTYDATALIST")
        @XmlElement(name = "PROPERTYDATA")
        private List<PropertyData> propertyDataList;
    }
    

    属性数据。类别:

    @XmlAccessorType(XmlAccessType.NONE)
    @Data
    @XmlType(propOrder = {"property", "amount", "term", "maturityDate", "fixedRate" })
    public class PropertyData {
    
        @XmlElement(name = "PROPERTY")
        private String property;
    
        @XmlElement(name = "AMOUNT")
        private String amount;
    
        @XmlElement(name = "TERM")
        private String term;
    
        @XmlElement(name = "MATURITYDATE")
        private String maturityDate;
    
        @XmlElement(name = "FIXEDRATE")
        private String fixedRate;
    }
    

    JaxbExampleMain。类别:

    public class JaxbExampleMain {
        public static void main(String[] args) throws JAXBException, XMLStreamException {
            final InputStream inputStream = Unmarshalling.class.getClassLoader().getResourceAsStream("facility.xml");
            final XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance().createXMLStreamReader(inputStream);
            final Unmarshaller unmarshaller = JAXBContext.newInstance(Facility.class).createUnmarshaller();
            final Facility facility = unmarshaller.unmarshal(xmlStreamReader, Facility.class).getValue();
            System.out.println(facility.toString());
    
            Marshaller marshaller = JAXBContext.newInstance(Facility.class).createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            marshaller.marshal(facility, System.out);
        }
    }
    

    以下是您得到的输出:

    Facility(arrangementActivity=ArrangementActivity(application=null, version=null, operation=null, id=NEW, customer=500000030, propertyDataList=[PropertyData(property=FACOMMITMENT, amount=600000, term=5Y, maturityDate=20261001, fixedRate=null), PropertyData(property=PRINCIPALINT, amount=null, term=null, maturityDate=null, fixedRate=3.5)]))
    <FACILITY>
       <ARRANGEMENTACTIVITY>
          <ID>NEW</ID>
          <CUSTOMER>500000030</CUSTOMER>
          <PROPERTYDATALIST>
             <PROPERTYDATA>
                <PROPERTY>FACOMMITMENT</PROPERTY>
                <AMOUNT>600000</AMOUNT>
                <TERM>5Y</TERM>
                <MATURITYDATE>20261001</MATURITYDATE>
             </PROPERTYDATA>
             <PROPERTYDATA>
                <PROPERTY>PRINCIPALINT</PROPERTY>
                <FIXEDRATE>3.5</FIXEDRATE>
             </PROPERTYDATA>
          </PROPERTYDATALIST>
       </ARRANGEMENTACTIVITY>
    </FACILITY>
    

  •  类似资料:
    • 在不使用getter和setter的情况下,JAXB可以正确地解组所提供的JSON。 null和“null”是完全不同的东西,但是我不想在POJO中包含这个字段,并且我必须忽略这些null值。 编辑

    • 我想从JMS中检索一些数据,过滤它们并发送到REST服务器。当我解组这些数据时,我得到一个错误: java.lang.IllegalArgumentException:读取器不能为空 位于com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshalleImpl.unmarshall0(UnmarshallerImpl.java:370)位于com.sun.x

    • 我有一个XML要与JAXB解组。如果我从元素中删除所有名称空间属性,代码运行良好,但是如果我保留名称空间属性的话,在解组后会得到一个空对象。 XML是这样的: 我的动物豆是这样的: 猫豆就像: 在运行时,我得到一个空对象。我试图从属性中删除< code>"z:",得到了这个异常: 如果我从猫和动物中删除命名空间,我会得到这个例外: 下面是解组的最终代码。最后一行给出了一个空指针异常 我不确定如何处

    • 我有一个简单的xml要解组。但是我在输出中只得到一个空列表。不会引发任何异常。这是一个第三方生成的xml,我需要使这一工作没有任何变化的xml。 XML: 用于动物的POJO豆: 猫咪的POJO豆 非马歇尔代码是: 最后一行给出了空指针异常。 我是否对 BEAN 类中的命名空间执行了操作?我是Jaxb的新手,这个问题现在困扰了我3天!我之前问过这个问题,但无法得到正确的答案,这是一个更准确的问题。

    • 仅当我从 XML 文件内的所有元素中删除“bpmn:”时,此代码才有效,否则它会引发以下异常: javax.xml.bind.UnmarshalException:意外元素(URI:"http://www.omg.org/spec/BPMN/20100524/MODEL",local:"定义") 我试图在不修改XML文件的情况下使其工作。任何帮助将不胜感激。提前致谢 :)

    • 我有情况, 有一个sample.xsd(旧版本-没有命名空间)。为同一个XSD文件使用XJC生成JAXB类。我得到了一个使用JAXB类基于XSD解封XML数据文件的示例。sample.xsd文件已更改(新版本-添加的命名空间)。再次为新的XSD文件使用XJC生成JAXB类。该示例已更新,现在可以用于新的XSD文件 现在我有一个情况,我正在获取基于旧XSD的XML数据文件,我想使用更新的示例文件来解