2015-11-03 256 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