Java 用JAXB解组
我需要将XML字符串解组到项目中已经存在的类中,但我不知道如何将XML的某个部分解组到对象列表中。让我用一些代码来解释: 我有以下XML: 当我尝试将XML解组到这些类中时,字段id和name被正确处理,但是地址的处理不正确:Java 用JAXB解组,java,xml,jaxb,unmarshalling,Java,Xml,Jaxb,Unmarshalling,我需要将XML字符串解组到项目中已经存在的类中,但我不知道如何将XML的某个部分解组到对象列表中。让我用一些代码来解释: 我有以下XML: 当我尝试将XML解组到这些类中时,字段id和name被正确处理,但是地址的处理不正确: 输出 用户: 身份证号码:123 诺姆:约翰·多伊 地址:空 我如何解决这个问题?是否有一些JAXB注释可以使用?怎么做?或者我需要创建某种类型的XmlAdapter吗?(我尝试过这个,但没有成功…我认为您必须更改私有财产地址的类型: @XmlAccessorTy
- 输出
用户:
身份证号码:123
诺姆:约翰·多伊
地址:空
我如何解决这个问题?是否有一些JAXB注释可以使用?怎么做?或者我需要创建某种类型的XmlAdapter吗?(我尝试过这个,但没有成功…我认为您必须更改私有财产地址的类型:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "User", propOrder = {"id", "name", "vaddresses"})
public class User {
@XmlElement
private int id;
@XmlElement
private String name;
@XmlElement
private VAddress vaddresses;
//...
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "VAddress", propOrder = {"addresses"})
public class VAddress {
@XmlElement
private List<Address> addresses;
//...
}
@xmlacessortype(xmlacesstype.FIELD)
@XmlType(name=“User”,proporter={“id”,“name”,“vaddress”})
公共类用户{
@XmlElement
私有int-id;
@XmlElement
私有字符串名称;
@XmlElement
私人地址;
//...
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name=“VAddress”,propOrder={“addresses”})
公共类地址{
@XmlElement
私人名单地址;
//...
}
也许您也可以尝试注释@XmlElementWrapper
关于,User.java
package generated;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"id",
"name",
"vaddresses"
})
@XmlRootElement(name = "user")
public class User {
protected int id;
@XmlElement(required = true)
protected String name;
@XmlElement(required = true)
protected User.Vaddresses vaddresses;
public int getId() {
return id;
}
public void setId(int value) {
this.id = value;
}
public String getName() {
return name;
}
public void setName(String value) {
this.name = value;
}
public User.Vaddresses getVaddresses() {
return vaddresses;
}
public void setVaddresses(User.Vaddresses value) {
this.vaddresses = value;
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"address"
})
public static class Vaddresses {
@XmlElement(required = true)
protected List<User.Vaddresses.Address> address;
public List<User.Vaddresses.Address> getAddress() {
if (address == null) {
address = new ArrayList<User.Vaddresses.Address>();
}
return this.address;
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"street"
})
public static class Address {
@XmlElement(required = true)
protected String street;
public String getStreet() {
return street;
}
public void setStreet(String value) {
this.street = value;
}
}
}
}
输出:--
ID::123
姓名:约翰·多伊
地址::XYZ街
街道ABC您可以利用
@xmlementwrapper
在集合周围添加分组元素:
@XmlElementWrapper(name="vaddresses")
@XmlElement(name="address")
private List<Address> addresses;
@xmlementwrapper(name=“vaddress”)
@xmlement(name=“address”)
私人名单
您的Java代码中不应该地址是变量吗?我以前从WSDL/XSD生成过JAXB注释类,它们遵循这种类型的结构(内部类),但现在更改我的类结构不是一个选项。
package generated;
import generated.User.Vaddresses.Address;
import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
public class JAXBExample {
public static void main(String[] args) {
try {
File file = new File("D:\\StackOverFlow\\JAXBTest\\file.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(User.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
User user = (User) jaxbUnmarshaller.unmarshal(file);
System.out.println("ID::"+user.getId());
System.out.println("Name::"+user.getName());
System.out.print("Addresses::");
for(Address address:user.getVaddresses().getAddress())
{
System.out.println(address.getStreet());
}
} catch (JAXBException e) {
e.printStackTrace();
}
}
}
@XmlElementWrapper(name="vaddresses")
@XmlElement(name="address")
private List<Address> addresses;