2015-11-03 4 views
1

Можно ли создать XML-документ JAXB таким образом. Как копии между MkDir и будет динамичнымJAXB добавить элемент динамически

<project> 
    <create> 
     <mkdir dest="src/java"/> 
     <copy src="test/src/java" dest="src/java" /> 
     <mkdir dest="{projectPath}/web/META-INF"/> 
    </create> 
</project> 

Мой код Java: -

@XmlRootElement(name = "project") 
public class Project {  
    private Create create; 
    private Tree tree;  
    public Create getCreate() { 
     return create; 
    }  
    public void setCreate(Create create) { 
     this.create = create; 
    }  
    public Tree getTree() { 
     return tree; 
    }  
    public void setTree(Tree tree) { 
     this.tree = tree; 
    }  
} 

@XmlRootElement 
public class Create { 

    private List<Mkdir> mkdir;  
    private Buildfile buildfile; 
    private Createfile createfile; 
    private Execute execute; 
    private Copy copy; 

    ..... 
} 

Я в состоянии достичь же путем JDOM, но я хочу сделать это с помощью Java Object.

Или я должен использовать любую другую библиотеку Java для этого.

+0

Зависит от того, как ваш 'Create' класса выглядеть. – Flown

+0

Извините, я забыл его добавить. – abhishek221192

+0

как вы получаете свой ''? – Flown

ответ

0

Вы должны использовать эту аннотацию класса Создать:

@XmlAccessorType(XmlAccessType.FIELD) 
public class Create { ... } 

Предполагая, что нет никаких сбоев в классах вы не показали (дерево, Buildfile, MKDIR, ...), вы можете использовать следующий код (где строка служит в качестве замены для всех классов неизвестного мне) маршал файл XML:

 
    void marshal() throws Exception { 
     Project root = new Project(); 
     Create create = new Create(); 
     root.setCreate(create); 
     create.getMkdir().add("make dir1"); 
     create.getMkdir().add("make dir2"); 
     create.setBuildfile("buildfile1"); 
     create.setCreatefile("createfile1"); 
     JAXBContext jc = JAXBContext.newInstance(Project.class); 
     Marshaller m = jc.createMarshaller(); 
     m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     m.marshal(root, System.out); 
    } 

Выход:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<project> 
    <create> 
    <mkdir>make dir1</mkdir> 
    <mkdir>make dir2</mkdir> 
    <buildfile>buildfile1</buildfile> 
    <createfile>createfile1</createfile> 
    </create> 
</project> 

Я полагаю, что все mkdirs могут быть впереди. Если у него есть, чтобы быть смешанным, это немного сложнее.

Редактировать Вам нужен список, способный удерживать элементы смешанных типов, лучших подтипов общего типа.

 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Create { 

    @XmlElements({ 
     @XmlElement(name = "mkdir", type = MkdirCommand.class), 
     @XmlElement(name = "copy", type = CopyCommand.class) 
    }) 
    private List cmds; 
    public List getCmds(){ 
    if(cmds == null) cmds = new ArrayList(); 
    return cmds; 
    } 
} 

class Command { 
} 

class MkdirCommand extends Command { 
    @XmlAttribute 
    public String dest; 
    public MkdirCommand(String d){ dest = d; } 
} 

class CopyCommand extends Command { 
    @XmlAttribute 
    public String src; 
    @XmlAttribute 
    public String dest; 
    public CopyCommand(String s, String d){ src = s; dest = d; } 
} 

Выход:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<project> 
    <create> 
    <mkdir dest="foo/dir1"/> 
    <copy src="source" dest="target"/> 
    <mkdir dest="bar/dir2"/> 
    </create> 
</project> 
+0

Не решает проблему встроить часть 'copy' между тегами' mkdir'. – Flown

+0

Это не решит проблему, я смог достичь того, что вы сделали. Мне нужно это посередине – abhishek221192

+0

@ abhishek221192 ОК, см. - более сложный вариант, который я добавил. – laune

Смежные вопросы