2016-11-07 79 views
2

我有一個包含以下元素的XML文件。如何確定Java中的子類的類型

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

因此,XML也可以是這樣的:

<productType> 
    <productTypeZ /> 
</productType> 

的XML通過使用JAXB解組到POJO。

我怎麼能確定的<productType>孩子是X,Y或Z?無論是在映射的POJO中,還是直接在XML中?

+0

那麼經過一個成功unmarshall不能你只是檢查哪些getters返回null?或者我不明白這個問題。 –

+0

@lazarov我__think__,它應該作爲'ProductType pt = new ProductTypeN()'取消組裝,其中N可以是X,Y **或** Z ......糾正我,如果錯的話,Robert。 – Fildor

+0

@lazarov這是可能的。我沒有提到有十種可能的「產品類型」,所以這將意味着很多「重複」來檢查哪個getter會返回null。也許有更好的方法? –

回答

1

現在有一個辦法也許不是最便宜的比檢查手工 - 爲每個GETTER有關的子類(null == obj.getProductTypeX())寫if但在這裏它是:

讓我們假設你最終JAXBElement<ProductType> productType當你解組時。

現在你需要用一個Element(org.w3c.dom.Element中的)對象結束。這是可以做到這樣的:

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

現在的界面Element擴展接口Node從中我們可以 來,我們與TREE結構對象在這裏結束了一個結論,我們可以得到他現有的兒童,如:

NodeList nodeList = elt.getChildNodes(); 

現在,您可以檢查的類型和每Node的價值,但你必須檢查的節點是在大多數情況下ELEMENT_NODEATTRIBUTE_NODE

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 
    } 
} 

我希望這會幫助你或給你任何指示如何獲得你所需要的。