Java 使用JAXB对具有继承结构的xml进行解组

Java 使用JAXB对具有继承结构的xml进行解组,java,jaxb,Java,Jaxb,我想解组这个xml <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <response> <command>dir</command> <directory name="folder"> <file> <lastModified>2016-06-06 12:45 AM</lastModified> &

我想解组这个xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<response>

  <command>dir</command>
  <directory name="folder">
   <file>
     <lastModified>2016-06-06 12:45 AM</lastModified>
     <name>input.txt</name>
     <size>123</size>
     <type>file</type>
  </file>
  <file>
     <lastModified>2016-06-06 12:45 AM</lastModified>
     <name>data.txt</name>
     <size></size>
     <type>directory</type>
  </file>
 </directory>
</response>

但这并没有起到相应的作用。由于注释不正确,obj仅包含响应类的命令字段。在“响应”下,标记“目录”和“消息”标记将根据激发的命令显示。如果命令为“dir”,则为“directory”标记,否则为“message”标记。所以我想要这个解组并将结果保存在相对继承类中。我该如何解决这个问题呢?

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


  • 事先阅读输入的XML并检查它是否有
    一个解决方案,尽管不是很优雅,但就是


    • 事先阅读输入XML并检查它是否有
      我有一个使用Sax解析器的解决方案。我把它上传到了。应该有更好的解决方案(包括隐式键入)。但这可以解决你的问题,同时创造新的问题。对文件和目录等的更改将在相应的处理程序中引入更改…

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

      您希望看到什么?我希望DirListingResponse.JAXB中的相对类中的结果对象在默认情况下没有那么灵活。但是有一些有用的扩展可能会对您有所帮助。看一看。从未使用过它,但听起来很有希望。您希望得到什么?我希望DirListingResponse.JAXB中的相对类中的结果对象在默认情况下没有那么灵活。但是有一些有用的扩展可能会对您有所帮助。看一看。从未使用过它,但听起来很有希望。
      xpath
      将是一个不错的选择。虽然简单字符串包含check,但如果使用
      搜索内容,如果响应为文本,则可以正常工作,但如果我触发dir,则显示java.lang.ClassCastException:response.binding.MessageResponse无法转换为client.ServerReader.run(ServerReader.java:42)上的response.binding.DirListingResponse
      xpath
      将是一个不错的选择。虽然简单字符串包含check,但如果使用
      搜索内容,如果响应为文本,则可以正常工作,但如果我触发dir,则显示java.lang.ClassCastException:response.binding.MessageResponse无法转换为client.ServerReader.run(ServerReader.java:42)上的response.binding.DirListingResponse
      
      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> file;
          String name;
      
          public Directory() {
          }
      
      
          @XmlAttribute
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          @XmlElement
          public ArrayList<File> getFile() {
              return file;
          }
      
          public void setFile(ArrayList<File> 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();
          }
      
      jaxbContext = JAXBContext.newInstance(MessageResponse.class);
      
      or 
      
      jaxbContext = JAXBContext.newInstance(DirListingResponse.class);