我是JAXB的新手,它似乎很简单,但是我有此XML(在本文的底部),我想将其映射到一个“ StorageArray” java对象。每个StorageArray对象将具有许多“ HostStorageDomain”对象,并且每个对象可能具有零个至多个“ WWN”对象。
我可能遇到的另一个问题是,我已经从“ StorageArray”类的其他来源设置了字段。除了HostStorageDomain和WWN之外的所有东西都存在,因此我确实不需要映射StorageArray,但是我确实需要child元素,因为那是我要映射的新信息。我正在从CSV中提取storagearray信息,当我开始解析此XML时,该数据将被填充(并且它也具有其他数据)。所以我不知道是否需要使用JAXB批注修改StorageArray类?
也,
我需要为HostStorageDomain和WWN创建一个类吗?我不在乎DvMCLIResult或CommandResult。
<?xml version="1.0" encoding="UTF-8"?>
<DvMCLIResult version="7.4.0-00">
<CommandResult command="GetSystemData">
<StorageArray objectID="ObjectID1" name="name1" description="Description1" serialNumber="87010488" arrayFamily="arrayModle" arrayType="arrayType" productName="productName" controllerVersion="controllerVersion" numberOfControllers="2" capacityInGB="96287" distributedMode="-1" >
<HostStorageDomain objectID="HSDOMAINID1" portID="0" portName="portName1" domainID="0" hostMode="Standard" hostMode2="" displayName="portName1" domainType="1" iSCSIName="iSCSIName1" nickname="nickname1" />
<HostStorageDomain objectID="HSDOMAINID2" portID="1" portName="portName2" domainID="0" hostMode="Standard" hostMode2="" displayName="portName2" domainType="1" iSCSIName="iSCSIName2" nickname="nickname2" >
<WWN nickname="WWName1" WWN="123456"/>
<WWN nickname="WWName2" WWN="234567"/>
<WWN nickname="WWName3" WWN="346578"/>
</HostStorageDomain>
<HostStorageDomain objectID="HSDOMAINID3" portID="16" portName="portName3" domainID="0" hostMode="Standard" hostMode2="" displayName="portName3" domainType="1" iSCSIName="iSCSIName3" nickname="nickname3" />
<HostStorageDomain objectID="HSDOMAINID4" portID="20" portName="portName4" domainID="0" hostMode="Standard" hostMode2="" displayName="portName2" domainType="0" nickname="nickname4" >
<WWN nickname="WWName4" WWN="342523"/>
</HostStorageDomain>
</StorageArray>
</CommandResult>
</DvMCLIResult>
编辑:
在斯蒂芬·卡尔森(Stephen Carlsons)回答之后-似乎可行,我会接受的是我遇到了错误:
javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"DvMCLIResult"). Expected elements are <{}HostStorageDomain>,<{}Path>,<{}StorageArray>,<{}WWN>
我有一个这样的存储类,其中包含HostStorageDomain类-StorageDomains
@XmlRootElement(name = "StorageArray")
@XmlAccessorType(XmlAccessType.NONE) // Only specifying the fields I want with annotations
public class Storage implements Serializable {
...
@XmlElement(name = "HostStorageDomain")
List<StorageDomain> domains = new ArrayList<StorageDomain>();
在翻译班上,我正在执行这样的解组
JAXBContext context = JAXBContext.newInstance(Storage.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
storage = (Storage) unmarshaller.unmarshal(is); // Inputstream of the xml String
有任何想法吗?
最佳答案
您需要为HostStorageDomain和WWN创建类,并注释StorageArray。 HostStorageDomain和WWN看起来类似:
@XmlRootElement(name="HostStorageDomain")
public class HostStorageDomain
{
@XmlElement
public WWN[] WWN_list;
@XmlAttribute(name="objectID")
public String ObjectID;
@XmlAttribute(name="portID")
public String PortID;
...
}
StorageArray将如下所示。如果不需要绑定其他属性,则可以跳过对其他属性的注释。但是,在解组之后,您将必须将解组过程创建的实例与内存中已有的内容进行协调:
@XmlRootElement(name="StorageArray")
public class StorageArray
{
@XmlElement
public HostStorageDomain[] Domains;
}
希望有帮助!
史蒂夫
关于java - 首次使用JAXB将XML映射到Java类-在构造方面需要一些帮助,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16794889/