2014-02-11 4 views
1

XML 문자열을 이미 내 프로젝트에있는 클래스로 비 정렬해야하지만 XML의 특정 부분을 객체 목록에 비 정렬 화하는 방법을 알 수 없습니다. 나는이 XML이JAXB로 비 정렬 화

:

<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를 만들어야합니까?

@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

는'자바 코드에서'vadresses' 수 addresses'하지 않나요? – Claus

답변

1

당신은 당신의 수집 주위에 그룹화 요소를 추가 @XmlElementWrapper을 활용할 수 있습니다

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

을 필요보다 더 많은 주석을 추가하고 있습니다. JAXB는 예외에 의한 구성이므로 XML 표현을 기본값과 다르게하려는 부분에만 주석을 달면됩니다.

+1

감사합니다. 문제가 해결되었습니다. – Baderous

1

난 당신이 개인 재산 주소의 유형을 변경해야 할 것 같아요.

감사합니다,

+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 개 이름 : 홍길동 주소 :: 거리 XYZ 번지 ABC

+0

이전에 WSDL/XSD에서 JAXB 주석 클래스를 생성했으며 구조 (내부 클래스)의 유형을 따랐지만 지금은 클래스 구조를 변경하는 것이 옵션이 아닙니다. – Baderous

관련 문제