Java 使用JAXB对具有继承结构的xml进行解组
我想解组这个xmlJava 使用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 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中的相对类中的结果对象在默认情况下没有那么灵活。但是有一些有用的扩展可能会对您有所帮助。看一看。从未使用过它,但听起来很有希望。
将是一个不错的选择。虽然简单字符串包含check,但如果使用xpath
搜索内容,如果响应为文本,则可以正常工作,但如果我触发dir,则显示java.lang.ClassCastException:response.binding.MessageResponse无法转换为client.ServerReader.run(ServerReader.java:42)上的response.binding.DirListingResponse
将是一个不错的选择。虽然简单字符串包含check,但如果使用xpath
搜索内容,如果响应为文本,则可以正常工作,但如果我触发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);
- 事先阅读输入XML并检查它是否有