为了账号安全,请及时绑定邮箱和手机立即绑定

JAXB @XmlRootElement 同名

JAXB @XmlRootElement 同名

呼如林 2021-09-03 16:54:40
我有一个很长的 XML,如:<Author>    <id></id>    <name></name>    <title></title>    <address></address>     ....</Author>我之前使用 JAXB 来解析 XML。JAXBContext.newInstance(Author.class);还有我的 Author.java@XmlRootElement(name = "Author")public class Author {     private String id;     private String name;     private String title;     private String address;     ...}它运行良好,但我不想每次都将整个 XML 解析为一个大的 Java bean。所以,我想使用以下方式:创建评论员.java@XmlRootElement(name = "Author")public class Commentator {     private String id;     private String name;     // setters, getters}创建 Analyst.java@XmlRootElement(name = "Author")public class Analyst {     private String title;     private String address;     // setters, getters}我写下面的代码来测试。JAXBContext context = JAXBContext.newInstance(Analyst.class, Commentator.class);Unmarshaller unmarshaller = context.createUnmarshaller();String xml = "<Author> <id>1</id> <name>A</name> <title>B</title> <address>C</address></Author>";Commentator obj = (Commentator) unmarshaller.unmarshal(new ByteArrayInputStream(xml.getBytes()));System.out.println(obj);它将打印正确的结果。如果我想得到分析师。Analyst a = (Analyst) unmarshaller.unmarshal(new ByteArrayInputStream(xml.getBytes()));我会得到异常: java.lang.ClassCastException: com.xxx.Commentator cannot be cast to com.xxx.Analyst我不确定这种方式对解析器是否正确。但我真的需要这样的功能。
查看完整描述

2 回答

?
侃侃尔雅

TA贡献1801条经验 获得超15个赞

只需找到一个快速的方法来做到这一点:

  1. 注册 pojo。

JAXBContext context = JAXBContext.newInstance(Analyst.class, Commentator.class);

  1. 处理输入。我正在将 str-xml 转换为 StreamSource。

String xml = "<Author> <id>1</id> <name>A</name> <title>B</title> <address>C</address></Author>";
StreamSource source = new StreamSource(new ByteArrayInputStream(xml.getBytes()));
  1. 创建解组器。

Unmarshaller unmarshaller = context.createUnmarshaller();

  1. (重要)当你解组数据时,给出第二个参数(你想要解组的类)

JAXBElement<Analyst> unmarshal = unmarshaller.unmarshal(source, Analyst.class);

然后,得到你想要的:

Analyst analyst = unmarshal.getValue();

  1. 如果需要另一个 pojo。(注意unmarshaller&source不能在方法中重用)

JAXBElement<Commentator> unmarshal2 = unmarshaller2.unmarshal(source2, Commentator.class);

进而:

Commentator com = unmarshal2.getValue();

没有错误报告,结果是正确的。


查看完整回答
反对 回复 2021-09-03
?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

在我看来,将多个 Java 类映射到相同的@XmlRootElement. 但无论如何,你仍然能够实现你想要的。


你需要不同的JAXBContextsAnalyst和Commentator。

而且因为 aJAXBContext是一个大对象并且JAXBContext.newInstance(...)需要很长时间来执行,所以将这些JAXBContext实例保存在static变量中并重用它们而不是创建新实例是有意义的:


private static JAXBContext analystContext;

private static JAXBContext commentatorContext;

if (analystContext == null)

    analystContext = JAXBContext.newInstance(Analyst.class);

if (commentatorContext == null)

    commentatorContext = JAXBContext.newInstance(Commentator.class);

因此,您还需要Unmarshaller从它们创建不同的s:


Unmarshaller analystUnmarshaller = analystContext.createUnmarshaller();

Unmarshaller commentatorUnmarshaller = commentatorContext.createUnmarshaller();

然后您可以将相同的 XML 内容解组到不同的根类:


String xml = "<Author> <id>1</id> <name>A</name> <title>B</title> <address>C</address></Author>";

Analyst analyst = (Analyst) analystUnmarshaller.unmarshal(new ByteArrayInputStream(xml.getBytes()));

Commentator commentator = (Commentator) commentatorUnmarshaller.unmarshal(new ByteArrayInputStream(xml.getBytes()));



查看完整回答
反对 回复 2021-09-03
  • 2 回答
  • 0 关注
  • 171 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信