2016-03-31 63 views
1

我想將一些XML解析爲Java,但是這個XML是一團糟。傑克遜在同一個POJO中映射不同的展開元素

因此,看起來像傑克遜只讀取每種類型的最後一個對象,每種類型的數組大小隻有一個對象。

編輯:這就是我想要做的(調試,看看錶單對象的值):

public class Main { 

    public static void main(String[] args) throws IOException { 
     XmlMapper mapper = new XmlMapper(); 
     Form form = mapper.readValue(getXml(), Form.class); 
    } 

    public static String getXml() { 

     return "<forms>\n" 
      + " <circles><x>1</x></circles>\n" 
      + " <squares><x>1</x></squares>\n" 
      + " <squares><x>1</x></squares>\n" 
      + " <circles><x>1</x></circles>\n" 
      + " <squares><x>1</x></squares>\n" 
      + "</forms>"; 

    } 

} 

@JacksonXmlRootElement(localName = "forms") 
class Form { 

    @JacksonXmlElementWrapper(useWrapping = false) 
    @JacksonXmlProperty(localName = "circles", isAttribute = false) 
    private List<Circle> circles; 

    @JacksonXmlElementWrapper(useWrapping = false) 
    @JacksonXmlProperty(localName = "squares", isAttribute = false) 
    private List<Square> squares; 

    public List<Circle> getCircles() { 
     return circles; 
    } 

    public void setCircles(List<Circle> circles) { 
     this.circles = circles; 
    } 

    public List<Square> getSquares() { 
     return squares; 
    } 

    public void setSquares(List<Square> squares) { 
     this.squares = squares; 
    } 

} 

@JacksonXmlRootElement(localName = "circles") 
class Circle { 

    @JacksonXmlProperty(isAttribute = false) 
    private String x; 

    public String getX() { 
     return x; 
    } 

    public void setX(String x) { 
     this.x = x; 
    } 

} 

@JacksonXmlRootElement(localName = "squares") 
class Square { 

    @JacksonXmlProperty(isAttribute = false) 
    private String x; 

    public String getX() { 
     return x; 
    } 

    public void setX(String x) { 
     this.x = x; 
    } 

} 
+0

您需要包含更多信息:確切地說,您不清楚您在做什麼以及如何做。所以,顯示使用情況的Java代碼會有所幫助。但我同意所示的代碼是一團糟,並且將其映射到任何可用的東西可能並不容易。但是你可以嘗試使用'@ JsonAnySetter',和/或在setter-methods中對那些不相交的'points'和'squares'元素進行特殊處理。 – StaxMan

+0

更多信息已添加。 – carf

+0

有關額外信息的任何想法? – carf

回答

1

初始化列表。

@JacksonXmlElementWrapper(useWrapping = false) 
    @JacksonXmlProperty(localName = "circles", isAttribute = false) 
    private final List<Circle> circles = new ArrayList<>(); 

而不是替換,添加所有元素。

public void setCircles(List<Circle> circles) { 
     this.circles.addAll(circles); 
    } 

這是訣竅。感謝@StaxMan。

0

由於列表是不連續的,什麼情況是,他們將獲得單獨創建,以便最後的運行早先覆蓋。您可以通過執行setCircles(etc)來追加到列表來解決此問題,而不是替換它。