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.
Ok, es scheint, dass das Problem mit dem Root-XmlElement zusammenhängt. – user2549803
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
Hallo, könnten Sie eine Antwort auf Ihre eigene Frage posten, damit Ihr Problem als beantwortet markiert wird? Vielen Dank. –