gpt4 book ai didi

java - 具有相同名称的 JAXB @XmlRootElement

转载 作者:行者123 更新时间:2023-12-02 10:50:30 31 4
gpt4 key购买 nike

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

所以,我想使用以下方式:

创建Commentator.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无法转换为com.xxx.Analyst

我不确定这种方式对于解析器是否正确。但我确实需要这样一个功能。

最佳答案

在我看来,映射多个 Java 类是一个有点笨拙的设计具有相同的@XmlRootElement。但尽管如此,你仍然能够实现你想要的。

AnalystCommentator 需要不同的 JAXBContext
由于 JAXBContext 是一个大对象,并且 JAXBContext.newInstance(...) 需要相当长的时间来执行,将这些 JAXBContext 实例保存在静态变量中是有意义的并重用它们而不是创建新的:

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:

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()));

关于java - 具有相同名称的 JAXB @XmlRootElement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52218248/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com