"xsi: type" and "xmlns: xsi" in generated xml from JAXB

I use JAXB to create a hierarchy of folders and files

My model:

@XmlRootElement public class Root { @XmlAttribute private String path; @XmlElement(name = "dir") private ArrayList<Dir> rootContentDirs = null; @XmlElement(name = "file") private ArrayList<FileObj> rootContentFiles = null; public void setRootContentDirs(ArrayList<Dir> rootContentDirs) { this.rootContentDirs = rootContentDirs; } public void setRootContentFiles(ArrayList<FileObj> 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; } } 

I want to create a tree of directories and files:

 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<FileObj> rootFiles = addFiles(dir); ArrayList<Dir> rootDirs = make(dir); root = new Root(); root.setPath(dir.getPath()); root.setRootContentFiles(rootFiles); root.setRootContentDirs(rootDirs); /.../ } 

But I how the weird "xsi: type" and "xmlns: xsi" in the generated xml:

 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <root path="/home/phlamey/IdeaProjects/FileUtillite"> <dir name="src"> <dir xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="dir" name="test"> <dir xsi:type="dir" name="java"> /.../ 

So my question is: what does this mean and how to remove it?

+8
java xml jaxb
source share
1 answer

In your Dir class, you do not specify the type of your collection, so JAXB adds xsi:type attributes.

You have:

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

If your ArrayList will contain Dir instances, you can do:

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

If for some reason you do not want to specify the type in the collection, you can do this in the @XmlElement annotation:

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

All Articles