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;