2016-11-07 49 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 
    } 
} 

我希望这会帮助你或给你任何指示如何获得你所需要的。