java - 第一次使用 JAXB 将 XML 映射到 Java 类 — 需要一些构建帮助

标签 java xml jaxb

我是 JAXB 新手,它似乎非常简单,但我有这个 XML(在这篇文章的底部),我想将它映射到一个“StorageArray”java 对象。每个 StorageArray 对象将有许多“HostStorageDomain”对象,并且每个对象可能有零到多个“WWN”对象。

我可能遇到的另一个问题是,我已经从“StorageArray”类的不同来源设置了字段。除了 HostStorageDomain 和 WWN 之外的所有内容都存在,因此我实际上不需要映射 StorageArray,但我确实需要子元素,因为这是我想要映射的新信息。我从 CSV 中提取存储阵列信息,当我开始解析此 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

有什么想法吗?

最佳答案

您需要为 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 将如下所示。如果不需要绑定(bind)其他属性,则可以跳过注释它们。但是,在解码之后,您必须将解码过程创建的实例与内存中已有的任何内容进行协调:

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

希望有帮助!

史蒂夫

关于java - 第一次使用 JAXB 将 XML 映射到 Java 类 — 需要一些构建帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16794889/

相关文章:

java - 毕加索不会加载图像 (Android)

java - 通过 JAXB 为枚举提供自定义值序列化

java - 复杂类型中的 XJC javaType 适配器

java - 无法加载资源,总是返回null

java - JPA:可自动和手动设置的 Id 列

java - 如何在 Apache http 客户端中设置连接超时?

Javascript - 表单上的原型(prototype) : Event. 观察不适用于 IE

java - XML解析为Java Object List<Map<String,String>> sqlParams;

java - 将嵌套对象编码为 "flat"XML 结构

java - Java中各种字符串比较的区别