2014-02-11 124 views
1

我需要将XML字符串解组到一个已存在于我的项目中的类中,但我无法弄清楚如何将XML的某个部分解组到对象列表中。让我有一些代码解释:解组和JAXB

我有这样的XML:

<user> 
    <id>123</id> 
    <name>John Doe</name> 
    <vaddresses> 
    <address> 
     <street>Street XYZ</street> 
    </address> 
    <address> 
     <street>Street ABC</street> 
    </address> 
    </vaddresses> 
</user> 

而且我有这些类:

  • 用户
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "User", propOrder = {"id", "name", "addresses"}) 
public class User { 

    @XmlElement 
    private int id; 

    @XmlElement 
    private String name; 

    @XmlElement 
    private List<Address> addresses; 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public List<Address> getAddresses() { 
     return addresses; 
    } 

    public void setAddresses(List<Address> addresses) { 
     this.addresses = addresses; 
    } 
  • 地址
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "Address", propOrder = {"street"}) 
public class Address { 

    @XmlElement 
    private String street; 

    public String getStreet() { 
     return street; 
    } 

    public void setStreet(String street) { 
     this.street = street; 
    } 
} 

当我尝试将XML解组为这些类,农田ID被正确处理,但同样不与地址发生:

  • 输出
User: 
    Id: 123 
    Nome: John Doe 
    Addresses: null 

我该如何解决这个问题?是否有一些我可以使用的JAXB注释?如何?或者我需要创建一些类型的XmlAdapter? (我已经试过这一个,但没有成功...)

+0

不应该'addresses'是在Java代码中'vadresses'? – Claus

回答

1

您可以利用@XmlElementWrapper添加在你的集合分组元素:

@XmlElementWrapper(name="vaddresses") 
@XmlElement(name="address") 
private List<Address> addresses; 

注意

你增加更多的注解比是必要的。 JAXB通过异常进行配置,因此您只需要注释您希望XML表示与默认值不同的位置。

+1

谢谢,它解决了这个问题。 – Baderous

1

我认为你必须改变私人财产地址类型:

@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; 

    //... 
} 

也许你也可以尝试注释@XmlElementWrapper。

问候,

+0

@XmlElementWrapper解决了它。 – Baderous

0

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; 
      } 

     } 

    } 

} 

JaxBExample.java

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(); 
     } 

    } 
} 

输出: -

ID :: 123个 姓名::李四 地址:: Street XYZ Street ABC

+0

我之前已经从WSDL/XSD生成JAXB注释类,并且它们遵循该类型的结构(内部类),但此时更改我的类结构不是一种选择。 – Baderous