簡體   English   中英

首次使用JAXB將XML映射到Java類-在構造方面需要一些幫助

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM