我正试图使用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之外的所有元素。下面是输出
我发现您的代码存在一些问题:
>
您已经在java类中添加了多个根元素(ArrangementActive,Property tyData)。应该只有一个根元素(设施)。
您在proporter
中添加了几个属性,您应该包括所有属性,除非其中任何属性被标记为瞬态
。
您的XML将字段大写为
,但字段是小写的,因此它不能在解组
期间直接赋值。您可以使用@XmlElement
来指定它在XML中的名称。
(您要求的)您必须在列表中使用@xmlementwrapper
和xmlement
。
注意:我使用了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数据文件,我想使用更新的示例文件来解