0

私は JAXB を初めて使用し、非常に簡単に思えますが、この XML (この投稿の下部) があり、それを 1 つの "StorageArray" Java オブジェクトにマップしたいと考えています。各 StorageArray オブジェクトには多くの「HostStorageDomain」オブジェクトがあり、それらのそれぞれにゼロから多数の「WWN」オブジェクトがある場合があります。

もう 1 つの問題は、"StorageArray" クラスの別のソースからフィールド セットを既に持っていることです。HostStorageDomain と WWN 以外はすべて存在するため、StorageArray をマップする必要はありませんが、マップする新しい情報であるため子要素が必要です。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>

編集:

次のスティーブン・カールソンの回答 - これは機能しているようで、エラーが発生していることを受け入れます:

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

何か案は?

4

1 に答える 1

1

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

それが役立つことを願っています!

スティーブ

于 2013-05-29T07:06:15.640 に答える