2014-05-13 4 views
2

XML 문서를 Java 객체 트리로 변환하는 데 JAXB Unmarshaller를 사용하려고합니다.JAXB unmarshal이 루트가 아닌 요소를 반환합니다.

은 XML 문서는 다음과 같습니다

Levels.java :

@XmlRootElement 
public class Levels { 

    private List<Level> levels = new ArrayList<Level>(); 

    @XmlElementRef(name="Level") 
    public List<Level> getLevels() { 
     return levels; 
    } 

    public void setLevels(List<Level> levels) { 
     this.levels = levels; 
    } 
} 

Level.java :

<Levels> 
    <Level> 
     <Solution> 
      <Piece x="0" y="1"> 
       <Shape/> 
       <Color/> 
      </Piece> 
      <Piece x="0" y="1"> 
       <Shape/> 
       <Color/> 
      </Piece> 
     </Solution> 
     <Clues> 
      <Clue> 
       <Piece x="0" y="0"> 
        <Shape/> 
        <Color/> 
       </Piece> 
      </Clue> 
      <Clue> 
       <Piece x="0" y="0"> 
        <Shape/> 
        <Color/> 
       </Piece> 
      </Clue> 
     </Clues> 
    </Level> 
</Levels> 

내가 각 구성 요소를 유지하는 것은 매우 기본적인 클래스를 생성

@XmlRootElement(name="Levels") 
public class Level { 

    private Solution solution = new Solution(); 
    private Clues clues = new Clues(); 

    @XmlElementRef(name="Solution") 
    public Solution getSolution() { 
      return solution; 
    } 

     public void setSolution(Solution solution) { 
     this.solution = solution; 
    } 

    @XmlElementRef(name="Clues") 
    public Clues getClues() { 
     return clues; 
    } 

    public void setClues(Clues clues) { 
     this.clues = clues; 
    } 
} 

Th 클래스의 전자 휴식이 (같은 주석 만 getter와 setter 메소드)

내가 XML을 비 정렬 화하기 위해 사용하는 코드와 같은이 포맷 :

File file = new File("res/levelTest.xml"); 

JAXBContext jaxbContext = JAXBContext.newInstance(Levels.class);   
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 

Object o = jaxbUnmarshaller.unmarshal(file);   
System.out.println(o); 

내가 무엇입니까 문제는 때 객체를 인쇄하면 [email protected]***이 아니라 [email protected]***이 루트 요소입니다. 이것은, unmarshaller가 루트 요소 이외의 요소를 돌려주고있는 것을 의미합니다. Google 검색 및 스택 오버플로가 있지만 이에 대한 설명을 찾을 수 없습니다.

도움을 주시면 감사하겠습니다.

답변

4

최상위 클래스 이름과 Level 클래스에있는 이름과 주석 충돌이 있습니다.

클래스의 루트 요소 인 "Levels"로 설정된 XmlElementRoot를 사용하여 Level 클래스에 주석을 추가했습니다. 그 클래스에 대한 주석에 명시 적으로 지정하지 않았으므로 JAXB 바인딩은 클래스에 대해 다른 매핑을 반환합니다.

나는 프로그램의 빠른 모형을 작성하고 다음과 같이 제대로 작동 얻을 수 있었다 :

레벨 클래스 :

@XmlRootElement(name="Levels") 
public class Levels { 


    private List<Level> levels = new ArrayList<Level>(); 

    @XmlElementRef(name="Level") 
    public List<Level> getLevels() { 
     return levels; 
    } 

    public void setLevels(List<Level> levels) { 
     this.levels = levels; 
    } 
} 

레벨 클래스 :

@XmlRootElement(name="Level") 
public class Level { 

    private Solution solution = new Solution(); 
    private Clues clues = new Clues(); 

    @XmlElementRef(name="Solution") 
    public Solution getSolution() { 
     return solution; 
    } 

    public void setSolution(Solution solution) { 
     this.solution = solution; 
    } 

    @XmlElementRef(name="Clues") 
    public Clues getClues() { 
     return clues; 
    } 

    public void setClues(Clues clues) { 
     this.clues = clues; 
    } 
} 

단서 클래스 (방금 클래스 정의가 필요했기 때문에 비어 있음) :

@XmlRootElement 
public class Clues { 
} 

솔루션 클래스 (위와 동일) :

@XmlRootElement 
public class Solution { 
} 

이 입력을 사용하여 코드를 실행하면 생성합니다

[email protected]*** 
+0

너무 감사합니다! 나는 모든 @XmlRootElement 어노테이션이 루트를 가리켜 야한다는 인상 아래에 있었다. – Harrison

관련 문제