我有一个很长的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 cannot be cast to com.xxx.Analyst
我不确定这种方式对解析器是否正确。但是我真的需要这样的功能。
最佳答案
只要找到一种快速的方法即可:
注册pojo。JAXBContext context = JAXBContext.newInstance(Analyst.class, Commentator.class);
处理输入。我将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()));
创建解组器。
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 - 具有相同名称的JAXB @XmlRootElement,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52218248/