JAXB @XmlRootElement 同名

我有一个很长的 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


我不确定这种方式对解析器是否正确。但我真的需要这样的功能。


呼如林
浏览 172回答 2
2回答

侃侃尔雅

只需找到一个快速的方法来做到这一点:注册 pojo。JAXBContext context = JAXBContext.newInstance(Analyst.class, Commentator.class);处理输入。我正在将 str-xml 转换为 StreamSource。String&nbsp;xml&nbsp;=&nbsp;"<Author>&nbsp;<id>1</id>&nbsp;<name>A</name>&nbsp;<title>B</title>&nbsp;<address>C</address></Author>"; StreamSource&nbsp;source&nbsp;=&nbsp;new&nbsp;StreamSource(new&nbsp;ByteArrayInputStream(xml.getBytes()));创建解组器。Unmarshaller unmarshaller = context.createUnmarshaller();(重要)当你解组数据时,给出第二个参数(你想要解组的类)JAXBElement<Analyst> unmarshal = unmarshaller.unmarshal(source, Analyst.class);然后,得到你想要的:Analyst analyst = unmarshal.getValue();如果需要另一个 pojo。(注意unmarshaller&source不能在方法中重用)JAXBElement<Commentator> unmarshal2 = unmarshaller2.unmarshal(source2, Commentator.class);进而:Commentator com = unmarshal2.getValue();没有错误报告,结果是正确的。

一只萌萌小番薯

在我看来,将多个 Java 类映射到相同的@XmlRootElement. 但无论如何,你仍然能够实现你想要的。你需要不同的JAXBContextsAnalyst和Commentator。而且因为 aJAXBContext是一个大对象并且JAXBContext.newInstance(...)需要很长时间来执行,所以将这些JAXBContext实例保存在static变量中并重用它们而不是创建新实例是有意义的:private static JAXBContext analystContext;private static JAXBContext commentatorContext;if (analystContext == null)&nbsp; &nbsp; analystContext = JAXBContext.newInstance(Analyst.class);if (commentatorContext == null)&nbsp; &nbsp; 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()));
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java