2016-06-23 24 views
0

Ich habe XML-Input, der im Grunde könnte wie folgt aussehen:Parsing optional verschachtelte XML-Elemente über JAXB

<mxGraphModel> 
<root> 
<mxCell id="0"/> 
<mxCell id="1" parent="0"/> 
<object label="" Property1="43" id="2"> 
    <mxCell style="whiteSpace=wrap;html=1;" vertex="1" parent="1"> 
    <mxGeometry x="196" y="161" width="200" height="30" as="geometry"/> 
    </mxCell> 
</object> 
<object label="" Property2="Helloooo" id="3"> 
    <mxCell style="whiteSpace=wrap;html=1;" vertex="1" parent="1"> 
    <mxGeometry x="192" y="269" width="200" height="30" as="geometry"/> 
    </mxCell> 
</object> 
<object label="" Property3="23" id="4"> 
    <mxCell style="whiteSpace=wrap;html=1;" vertex="1" parent="1"> 
    <mxGeometry x="210" y="383" width="200" height="30" as="geometry"/> 
    </mxCell> 
</object> 
</root> 
</mxGraphModel> 

Ich versuche, diesen Eingang über JAXB zu analysieren:

MxGraphModel.java:

@XmlRootElement(name = "mxGraphModel") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class MxGraphModel { 

    @XmlElementWrapper(name = "root") 

    @XmlElement(name = "object") 
    private ArrayList<MxObject> mxObjects; 

    @XmlElement(name = "mxCell") 
    private ArrayList<MxCell> mxCells; 

    //getters and setters... 
} 

MxObject.java:

@XmlAccessorType(XmlAccessType.FIELD) 
public class MxObject { 

    @XmlAttribute 
    private String id; 

    @XmlAttribute 
    private String label; 

    @XmlAttribute 
    private String documentName; 

    @XmlAttribute 
    private String documentDescription; 

    @XmlElement 
    private MxCell mxCell; 

    //getters and setters... 
} 

MxCell.java:

@XmlAccessorType(XmlAccessType.FIELD) 
public class MxCell { 

    @XmlAttribute 
    private String id; 

    @XmlAttribute 
    private String parent; 

    @XmlAttribute 
    private String value; 

    @XmlAttribute 
    private String style; 

    @XmlAttribute 
    private String vertex; 

    @XmlElement(name = "mxGeometry") 
    private MxGeometry geometry; 

    //getters and setters... 
} 

DemoController.java:

@RestController 
@RequestMapping("/xml") 
public class DemoController { 
    @RequestMapping(method = RequestMethod.POST, consumes = {MediaType.APPLICATION_XML_VALUE}) 
    public void parseXML(@RequestBody MxGraphModel mxGraphModel) { 
     //mxGraphModel contains EITHER objects of type MxObject 
     //OR 
     //MxCell 
    } 
} 

Mein Problem ist, dass die Parsing Operation führt zu einem MxGraphModel Objekt, das entweder eine Sammlung von Objekten oder eine Sammlung von mxCells enthält - aber niemals beides. Es scheint mir, dass die Reihenfolge, in der ich die XmlElements ("object" und "mxCell") deklariere, für das Analyseergebnis relevant ist. Wenn ich mxCell vor dem Objekt deklariere, werden 2 mxCells analysiert (was korrekt ist), aber die Objektsammlung bleibt null. Und umgekehrt. Ist es möglich, dass beide XmlElements analysiert werden? Ich weiß nicht, ob das Problem damit zusammenhängt, dass ein Objektelement selbst ein mxCell-Element enthalten könnte ...

Danke.

+0

Ok, es scheint, dass das Problem mit dem Root-XmlElement zusammenhängt. – user2549803

+0

Dies entspricht einer einzelnen Sammlung und nicht mehreren. Wenn ich das aus der XML-Eingabe herauslasse, wird alles korrekt geparst. Ich werde einfach nicht root als XmlElementWrapper implementieren. Das sollte den Trick machen. Vielen Dank! – user2549803

+0

Hallo, könnten Sie eine Antwort auf Ihre eigene Frage posten, damit Ihr Problem als beantwortet markiert wird? Vielen Dank. –

Antwort

0

@Dimpre Jean-Sébastien:

sind Sie völlig Recht, sorry für diese spät, um die Antwort zu veröffentlichen. Die Lösung ist nicht die Wurzel ElementWrapper zu verwenden

So anstelle von

@XmlElementWrapper(name = "root") 

ich eine Wurzel XmlElement in MxGraphModel.java zu schaffen hatte:

@XmlElement(name = "root") 
private MxRoot mxRoot; 

Außerdem habe ich eine Datei mit dem Namen MxRoot.java und verschoben alle Sammlungen darin:

MxRoot.java:

@XmlAccessorType(XmlAccessType.FIELD) 
public class MxRoot { 
    @XmlElement(name = "UserObject") 
    private ArrayList<MxObject> mxUserObjects; 

    @XmlElement(name = "object") 
    private ArrayList<MxObject> mxObjects; 

    //XmlElement sets the name of the entities 
    @XmlElement(name = "mxCell") 
    private ArrayList<MxCell> mxCells; 

    //getters and setters... 
} 

Es scheint, dass die @ XmlWrapper Annotation genau eine Auflistung erwartet. Es ist nicht gedacht, um mehrere Sammlungen zu wickeln (macht jetzt Sinn, dass ich es weiß :))

Danke an alle!

Verwandte Themen