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>
是否可以通过 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>