2015-11-03 135 views
1

是否有可能通过JAXB以这种方式创建XML文档。 作为副本之间的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对象来做到这一点。

或者我应该为此使用任何其他Java库。

+0

取决于如何你'Create'类的样子。 – Flown

+0

抱歉,我忘了添加它。 – abhishek221192

+0

你如何得到你的''? – Flown

回答

0

您应该使用此批注在类创建:

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

假设有在类无毛刺你还没有显示(树,构建文件,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

不解决问题以在mkdir标签之间内联'copy'部分。 – Flown

+0

它不能解决问题,我能够实现你所做的。我需要它在中间 – abhishek221192

+0

@ abhishek221192好的,请参阅 - 更复杂 - 我添加的变体。 – laune