Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用JAXB解组_Java_Xml_Jaxb_Unmarshalling - Fatal编程技术网

Java 用JAXB解组

Java 用JAXB解组,java,xml,jaxb,unmarshalling,Java,Xml,Jaxb,Unmarshalling,我需要将XML字符串解组到项目中已经存在的类中,但我不知道如何将XML的某个部分解组到对象列表中。让我用一些代码来解释: 我有以下XML: 当我尝试将XML解组到这些类中时,字段id和name被正确处理,但是地址的处理不正确: 输出 用户: 身份证号码:123 诺姆:约翰·多伊 地址:空 我如何解决这个问题?是否有一些JAXB注释可以使用?怎么做?或者我需要创建某种类型的XmlAdapter吗?(我尝试过这个,但没有成功…我认为您必须更改私有财产地址的类型: @XmlAccessorTy

我需要将XML字符串解组到项目中已经存在的类中,但我不知道如何将XML的某个部分解组到对象列表中。让我用一些代码来解释:

我有以下XML:

当我尝试将XML解组到这些类中时,字段idname被正确处理,但是地址的处理不正确:

  • 输出
用户:
身份证号码: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;