JAXB在生成的xml中使用“xsi:type”和“xmlns:xsi”

我使用JAXB来创建文件夹和文件层次结构

我的模特:

@XmlRootElement public class Root { @XmlAttribute private String path; @XmlElement(name = "dir") private ArrayList rootContentDirs = null; @XmlElement(name = "file") private ArrayList rootContentFiles = null; public void setRootContentDirs(ArrayList rootContentDirs) { this.rootContentDirs = rootContentDirs; } public void setRootContentFiles(ArrayList rootContentFiles) { this.rootContentFiles = rootContentFiles; } public void setPath(String path) { this.path = path; } } public class Dir { @XmlAttribute private String name; @XmlElement(name = "dir") private ArrayList dirs = null; @XmlElement(name = "file") private ArrayList files = null; public void setName(String name) { this.name = name; } public void setDirs(ArrayList dirs) { this.dirs = dirs; } public void setFiles(ArrayList files) { this.files = files; } } public class FileObj{ @XmlAttribute private String name; @XmlAttribute private long size; @XmlAttribute private String type; public void setName(String name) { this.name = name; } public void setSize(long size) { this.size = size; } public void setType(String type) { this.type = type; } } 

我想制作dirs和文件树:

 public class XmlByJaxb extends Generator { private static final String JAXB_XML = "./jaxb.xml"; private static Root root = null; @Override public void output() throws IOException { JAXBContext context = null; Marshaller m = null; try { context = JAXBContext.newInstance(Root.class, Dir.class, FileObj.class); m = context.createMarshaller(); m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); m.marshal(root, new File(JAXB_XML)); } catch (JAXBException e) { } } @Override public void run() { ArrayList rootFiles = addFiles(dir); ArrayList rootDirs = make(dir); root = new Root(); root.setPath(dir.getPath()); root.setRootContentFiles(rootFiles); root.setRootContentDirs(rootDirs); /.../ } 

但是我在生成的xml中有奇怪的“xsi:type”和“xmlns:xsi”:

      /.../ 

所以我的问题是:这意味着什么以及如何删除它?

在您的Dir类中,您没有指定集合的​​类型,这就是JAXB添加xsi:type属性的原因。

你有:

 @XmlElement(name = "dir") private ArrayList dirs; 

如果您的ArrayList将包含Dir实例,那么您可以执行以下操作:

 @XmlElement(name = "dir") private ArrayList dirs = null; 

如果由于某种原因您不想在集合上指定类型,那么您可以在@XmlElement注释中执行此操作:

 @XmlElement(name = "dir", type=Dir.class) private ArrayList dirs = null;