[英]First time using JAXB to map XML to a Java Class — need some help in construction
我是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;
}
希望有幫助!
史蒂夫
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.