在具有JAXB的inheritance结构的xml之后进行解组

我想解组这个xml

  dir   2016-06-06 12:45 AM input.txt 123 file   2016-06-06 12:45 AM data.txt  directory    

这是我的class级结构

 import java.util.ArrayList; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlSeeAlso; @XmlRootElement @XmlSeeAlso({MessageResponse.class}) class Response { String command; public Response() { } @XmlElement public String getCommand() { return command; } public void setCommand(String command) { this.command = command; } } @XmlRootElement class MessageResponse extends Response{ String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } } class DirListingResponse extends Response{ String name; Directory directory; @XmlElement public Directory getDirectory() { return directory; } public void setDirectory(Directory directory) { this.directory = directory; } } class Directory { ArrayList file; String name; public Directory() { } @XmlAttribute public String getName() { return name; } public void setName(String name) { this.name = name; } @XmlElement public ArrayList getFile() { return file; } public void setFile(ArrayList file) { this.file = file; } } class File { String name, type; String lastModified; long size; public File() { } public File(String name, String type, String lastModified, long size) { this.name = name; this.type = type; this.lastModified = lastModified; this.size = size; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getLastModified() { return lastModified; } public void setLastModified(String lastModified) { this.lastModified = lastModified; } public long getSize() { return size; } public void setSize(long size) { this.size = size; } } 

和主要的课程

 try { jaxbContext = JAXBContext.newInstance(Response.class); jaxbUnmarshaller = jaxbContext.createUnmarshaller(); Object obj = jaxbUnmarshaller.unmarshal(new InputSource(new StringReader(inputXml))); } catch (JAXBException e) { e.printStackTrace(); } 

但这没有相应的工作。 由于没有正确的注释,obj仅包含响应类的命令字段。 在“响应”标签下,“directory”和“message”标签基于触发的命令出现。 如果命令是“dir”,则“directory”标记否则为“message”标记。 所以我想要这个unmarshal并将结果保存在相对inheritance的类中。 我怎么解决这个问题?

一个解决方案虽然不优雅,但是

  • 事先读取输入XML并检查它是否有
  • 相应地实例化jaxbcontext。

 jaxbContext = JAXBContext.newInstance(MessageResponse.class); or jaxbContext = JAXBContext.newInstance(DirListingResponse.class); 

我有一个使用Sax-Parser的解决方案。 我把它上传到Github 。 应该有更好的解决方案(包括隐式打字)。 但这可以解决您的问题,同时创建新问题。 对文件和目录等的更改将在相应的处理程序中引入更改…