2013-12-19 5 views
8

ich JAXB Ordner zu erstellen, verwenden und Dateien Hierarchie"xsi: type" und "xmlns: xsi" in generierten XML von JAXB

Mein Modell:

@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; 
    } 
} 

Ich möchte Baum von dirs machen und Dateien:

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); 
/.../ 
} 

Aber ich hava seltsam "xsi: type" und "xmlns: xsi" in generierten 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"> 
      /.../ 

Also meine Frage: was bedeutet das und wie entfernt das?

Antwort

9

In Ihrer Dir Klasse geben Sie nicht den Typ Ihrer Sammlung an, deshalb fügt JAXB die xsi:type Attribute hinzu.

Sie haben:

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

Wenn Ihr ArrayList Instanzen von Dir enthalten wird, dann können Sie tun:

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

Wenn aus irgendeinem Grund Sie nicht auf den Typ angeben möchten die Sammlung dann können Sie es tun, in der @XmlElement Annotation:

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

Tha Nein, du. Es klappt. –

Verwandte Themen