第一次使用JAXB将XML映射到Java类——需要一些构造方面的帮助吗

第一次使用JAXB将XML映射到Java类——需要一些构造方面的帮助吗,java,xml,jaxb,Java,Xml,Jaxb,我是JAXB新手,它看起来非常简单,但我有这个XML(在本文的底部),我想将它映射到一个“StorageArray”java对象。每个StorageArray对象将有多个“HostStorageDomain”对象,其中每个对象可能有零到多个“WWN”对象 我可能遇到的另一个问题是,我已经为“StorageArray”类设置了不同来源的字段。除了HostStorageDomain和WWN之外的所有内容都存在,因此我不需要映射StorageArray,但我确实需要子元素,因为这是我想要映射的新信息。

我是JAXB新手,它看起来非常简单,但我有这个XML(在本文的底部),我想将它映射到一个“StorageArray”java对象。每个StorageArray对象将有多个“HostStorageDomain”对象,其中每个对象可能有零到多个“WWN”对象

我可能遇到的另一个问题是,我已经为“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>

有什么想法吗?

您需要为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;
}
希望有帮助


Steve

我的xmllint说您的XML无效,也许同事会尝试缩进它以完全理解结构。XML大得多,所以我缩短了它…我会再次检查,看看是否遗漏了任何关键内容。检查我问过的问题。这可能会对您有所帮助这很好,但我有一个问题,因为StorageArray不是根元素。我将在我的主要帖子中的编辑下发布这个错误。我刚刚为DvMCLIResult和CommandResult创建了类——它工作得很好。太棒了!很高兴你把问题解决了。:)
JAXBContext context = JAXBContext.newInstance(Storage.class);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            storage = (Storage) unmarshaller.unmarshal(is); // Inputstream of the xml String
@XmlRootElement(name="HostStorageDomain")
public class HostStorageDomain
{
    @XmlElement
    public WWN[] WWN_list;

    @XmlAttribute(name="objectID")
    public String ObjectID;

    @XmlAttribute(name="portID")
    public String PortID;

    ...
}
@XmlRootElement(name="StorageArray")
public class StorageArray
{
    @XmlElement
    public HostStorageDomain[] Domains;
}