我有一个很长的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(请注意unmarshallersource不能在方法中重复使用)


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

然后:

Commentator com = unmarshal2.getValue();

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

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

10-13 08:59