2009-05-07 15 views
6

Ich bin Parsen eines XML entordnen, die Knoten wie folgt hat:JAXB unter Verwendung von Elementen mit unterschiedlichen/dynamischen Namen Dokument

<objects> 
    <dog> 
    <data1>...</data1> 
    <data2>...</data2> 
    <data3>...</data3> 
    </dog> 
    <cat> 
    <data1>...</data1> 
    <data2>...</data2> 
    <data3>...</data3> 
    </cat> 
</objects> 

Die Elemente data1, Daten2, data3 sind immer konsistent. Nur das übergeordnete Tag variiert. In meinem Objektmodell habe ich ein einzelnes Objekt, das alle diese Fälle repräsentiert. Wie kann ich JAXB dazu bringen, mit diesem Fall umzugehen, ohne vorher den Namen des Elements zu kennen?

@XMLAnyElement stimmt mit allen Objekten überein, erstellt jedoch kein Objekt des entsprechenden Typs. Ich bekomme eine Liste von Knoten-Objekten anstelle von meinem Objekt. Mein Objekt sieht zur Zeit so etwas wie:

public class MyObject { 
    protected String otherData; 

    @XmlAnyElement 
    @XmlElementWrapper(name = "objects") 
    protected List<MyChildObject> childObjects; 
} 

public class MyChildObject { 
    protected String data1; 
    protected String data2; 
    protected String data3; 
} 

Irgendwelche Ideen, wie man diesen Fall kurz zu handhaben von dem eingehende XML-Format zu ändern <object type="dog"> Elemente verwenden?

Antwort

6

Wenn der Name wirklich dynamisch ist, dann glaube ich nicht, dass JAXB Ihnen dabei helfen wird. Wenn Sie eine definierte Anzahl verschiedener Elementnamen haben, können Sie Vererbung wie den anderen vorgeschlagenen Beitrag verwenden. Wenn die Anzahl der Elemente und Namen unbekannt ist, würde ich mit so etwas wie dies empfehlen:

@XmlMixed 
@XmlAnyElement 
public List<Object> getObjects() { 
    return objects; 
} 

Dies würde das Element ein nur ein DOM-Element ist. Sie könnten JAXB dann ein zweites Mal verwenden, um von jedem der Elemente in Ihren benutzerdefinierten Typ zu wechseln.

Das wäre, wenn Sie JAXB verwenden müssten. Es ist möglicherweise einfacher, die SAX- oder DOM-APIs direkt für solche Daten zu verwenden. JAXB ist wirklich für gut definierte Daten gedacht, die als Schema dargestellt werden können.

+0

Danke, das macht Sinn. Wir werden fortfahren und das Schema ändern, da wir diese Fähigkeit vorerst haben. – chetan

0

können Sie Vererbung:

@XmlRootElement(name = "dog") 
public class MyDogObject extends MyChildObject { 
    //nothing here 
} 

@XmlRootElement(name = "cat") 
public class MyCatObject extends MyChildObject { 
    //nothing here 
} 

diese Weise ist es Ihnen Typ befassen sich mit demselben Objekt lässt, MyChildObject, dennoch flexibel die XML-Struktur steuern. Ein weiterer Vorteil besteht darin, dass Sie, wenn Sie in Zukunft bestimmte XML-Knoten für Hunde/Katzen definieren, diese - wie erwartet - auf die entsprechende Unterklasse, jedoch nicht auf die andere, abbilden können.

+0

Dies setzt voraus, dass ich im Voraus das Universum der Objektnamen kenne, damit ich Unterklassen erstellen kann. Vorläufig tue ich das, aber es scheint eine Verschwendung zu sein. – chetan

Verwandte Themen