首页 > 解决方案 > 如何为可以是字符串或自定义类型的元素列表创建 JAXB 元素

问题描述

我对正确的解组元素有疑问,这些元素可以是字符串(仅包含一些文本),也可以是具有嵌套元素的节点,以下是此类 xml 的示例:

<response>
  <created>2021-06-23 14:59:40</created>
  <downloaded>2021-06-23 15:00:25</downloaded>
  <finished>2021-06-23 15:01:28</finished>
  <id>125150639</id>
  <meta>metatext</meta>
  <meta>
    <itemId>blabla1234</itemId>
    <type>linear</type>
    <wfType>720p</wfType>
    <shapes>
      <destination>http://google.com</destination>
      <tag>linear_hd</tag>
    </shapes>
  </meta>
  <meta/>
</response>

我的这个 xml 的 pojo 类:

响应.java:

package core.api.rest.response;

import core.api.rest.response.meta.Meta;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import lombok.Getter;
import lombok.ToString;
import lombok.experimental.Accessors;

@Getter
@ToString
@Accessors(chain = true)
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(namespace = "core.api.rest.response")
@XmlRootElement(name = "response")
public class Response {

    @XmlElement(name = "created")
    private String created;

    @XmlElement(name = "downloaded")
    private String downloaded;


    @XmlElement(name = "finished")
    private String finished;

    @XmlElement(name = "id")
    private String id;

    @XmlElement(name = "meta", type = Meta.class)
    private List<Object> meta;

}

元.java:

package core.api.rest.response.meta;

import core.utils.generatequerycode.GenerateQuery;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import lombok.Getter;
import lombok.ToString;
import lombok.experimental.Accessors;

@Getter
@ToString
@Accessors(chain = true)
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
@XmlType(namespace = "core.api.rest.response.meta")
public class Meta {

    @XmlElement(name = "itemId")
    private String itemId;

    @XmlElement(name = "type")
    private String type;

    @XmlElement(name = "wfType")
    private List<String> wfType;

    @XmlElement(name = "shapes")
    @JsonProperty("shapes")
    private List<Shapes> shapes;
}

形状.java:

package core.api.rest.response.meta;

import core.utils.generatequerycode.GenerateQuery;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
import lombok.Getter;
import lombok.ToString;
import lombok.experimental.Accessors;

@Getter
@ToString
@Accessors(chain = true)
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(namespace = "core.api.rest.response.meta")
public class Shapes {

    @XmlElement(name = "destination")
    private String destination;

    @XmlElement(name = "tag")
    private String tag;
}

所以问题是进一步访问所有 3 个元数据,在我的测试中我想(假设 Response 已经解组):

List<Object> meta = r.getMeta();
System.out.println(meta.get(0)); // <------ Here I would like to get "metatext"
System.out.println(((Meta)meta.get(1)).getItemId()); // <----- Here blabla1234
System.out.println(meta.get(2)); // <----- Here null

我被困住了,因为我不能将 Object 转换为 String 和 Meta,也不能从 jaxb 元素中获取内部文本(我试图将其转换为 org.w3c.Element,但再次从 Meta 类型转换失败)来决定是否是不是字符串。还试图编写一个从 XmlAdapter 扩展的适配器,但也未能获取文本内容。

标签: javaxmljaxbpojo

解决方案


推荐阅读