2016-11-07 3 views
2

Ich habe eine XML-Datei mit den folgenden Elementen.So ermitteln Sie den Klassentyp einer Unterklasse in Java

<productType> 
    <productTypeX /> 
    <!-- One of the following elements are also possible: 
    <productTypeY /> 
    <productTypeZ /> 
    --> 
</productType> 

So könnte die XML auch wie folgt aussehen:

<productType> 
    <productTypeZ /> 
</productType> 

Die XML ist mit einem POJO entordnet von JAXB verwenden.

Wie kann ich feststellen, ob das Kind von <productType> X, Y oder Z ist? Entweder im abgebildeten POJO oder direkt im XML?

+0

Gut nach einem erfolgreichen unmarshall können Sie nicht einfach überprüfen, welche Getter Null zurückgeben? Oder ich habe die Frage nicht verstanden. –

+0

@lazarov I __think__, es soll als ProduktType pt = new ProductTypeN() 'nicht marmoriert werden, wobei N X, Y ** oder ** Z sein könnte ... korrigiere mich wenn falsch, Robert. – Fildor

+0

@lazarov Das wäre möglich. Ich habe nicht erwähnt, dass es zehn mögliche "Produkttypen" gibt, das würde also eine Menge "Wiederholung" bedeuten, wenn geprüft wird, welcher Getter "null" zurückgibt. Vielleicht gibt es einen besseren Weg? –

Antwort

1

Jetzt ist es eine Möglichkeit, vielleicht nicht billiger als Überprüfungvon Hand - Schreiben if für jeden GETTER über Unterklassen (null == obj.getProductTypeX()), aber hier ist es:

Nehmen wir an, dass Sie mit JAXBElement<ProductType> productType am Ende wenn du dich entkommst.

Jetzt müssen Sie mit einem Element (org.w3c.dom.Element) -Objekt enden. Welche kann wie folgt geschehen:

DOMResult res = new DOMResult(); 
marshaller.marshal(productType, res); 
Element elt = ((Document)res.getNode()).getDocumentElement(); 

Nun ist die Schnittstelle Element erweitert die Schnittstelle Node aus dem wir zum Schluss gekommen, dass wir es hier mit einem TREE Strukturobjekt am Ende und wir können wie seine bestehenden Kinder bekommen:

NodeList nodeList = elt.getChildNodes(); 

Jetzt können Sie den Typ überprüfen und den Wert jedes Node aber Sie müssen überprüfen, ob der Knoten ein ELEMENT_NODE oder ATTRIBUTE_NODE in den meisten Fällen:

for (int i = 0; i < nodeList.getLength(); i++) { 
    Node currentNode = nodeList.item(i); 
    if (currentNode.getNodeType() == Node.ELEMENT_NODE) { 
     currentNode.getNodeName(); 
     currentNode.getTextContent(); 
     //And whatever you like 
    } 
} 

Ich hoffe, das wird Ihnen helfen oder Ihnen eine Wegbeschreibung geben, wie Sie bekommen, was Sie brauchen.

Verwandte Themen