JAXB 动态添加元素

JAXB add element dynamically

是否可以通过 JAXB 以这种方式创建 XML 文档。 由于复制在 mkdir 之间,它将是动态的

<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 库。

您应该在 class 创建时使用此注释:

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

假设您未显示的 classes 中没有故障(Tree、Buildfile、Mkdir,...),您可以使用以下代码(其中 String 用作所有 class我不知道)整理一个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 都可以放在前面。如果要混,那就稍微复杂一点。

Edit 您需要一个能够容纳混合类型元素的列表,即常见类型的最佳子类型。

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