java - 如何为可以是字符串或自定义类型的元素列表创建 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 扩展的适配器,但也未能获取文本内容。
解决方案
推荐阅读
- java - 上传的 GIF 图片不动
- vert.x - 访问静态文件导致“Connection reset by peer”异常
- android - 某些手机的 JavascriptInterface 无法正常工作
- python - 需要帮助以使此 .txt 文件为 TRUE
- python-3.x - 使用 FastApi 在服务器之间进行乒乓球
- r - 使用 R 比较数据框中的两列
- python - 基于列的numpy过滤矩阵
- postgresql - 无法连接服务器,超时过期到 Postgres RDS
- javascript - 为什么 react 不更新 setState 中的样式?
- full-text-search - 狮身人面像搜索结果页面未显示小节