JAXB为包含嵌套元素中的属性的xml文件定义java类

时间:2015-09-24 06:30:51

标签: jaxb

我想定义一个java类,然后使用JAXB将其实例编组为xml文件。

我想要的输出如下:

<paths>
<path action="R" kind="file" copyfrom-path="file1" copyto-path="file2">file2</path>
<path action="M" kind="file">file3</path>
</paths>

我定义了一个java类,如下所示:

@XmlRootElement(name = "paths")
@XmlAccessorType(FIELD)
public class changed_paths
{

    private List<String> path;

    public changed_paths()
    {
        path = new ArrayList<String>();
    }

    public List<String> getPath()
    {
        return path;
    }

    public void setPath(List<String> path)
    {
        this.path = path;
    }

    public void addPath(String p)
    {
        path.add(p);
    }

}

使用上面的java类,我可以生成没有<path></path>元素属性的输出xml文件。如下所示:

<paths>
    <path>file2</path>
    <path>file3</path>
</paths>

我尝试在changed_pa​​ths类中定义属性,如下所示:

@XmlAttribute 
private String kind;

public void setKind(String kind){
     this.kind = kind;
}

public String getKind(){
     return this.kind;
}

但是这会在标记<paths></paths>中输出属性为“kind”的xml文件,但不会在其嵌套的<path></path>标记中输出。

另一个问题是,当属性名称包含“ - ”(例如copyfrom-path)时,java将不允许我在其名称中使用“ - ”来定义这些变量。

有人可以告诉我如何定义: 1. <path></path>中的属性? 2.名字中带有“ - ”的属性? 有人可以帮我一下吗? 非常感谢你!

1 个答案:

答案 0 :(得分:0)

我找到了答案。要为<path></path>创建属性,我为此标记定义了类路径。并为<paths></paths>定义了另一个类路径。 要在名称中创建带“ - ”的属性,我使用注释@XmlAttribute(name = "copyfrom-path")

    @XmlAccessorType(FIELD)
public class path
{
    @XmlAttribute
    private String kind;

    @XmlAttribute
    private String action;

    @XmlAttribute(name = "copyfrom-path")
    private String copyfrom;

    @XmlAttribute(name = "copyfrom-rev")
    private String copyto;

    @XmlValue
    private String value;

    public void setKind(String kind)
    {
        this.kind = kind;
    }

    public String getKind()
    {
        return this.kind;
    }

    public void setAction(String action)
    {
        this.action = action;
    }

    public String getAction()
    {
        return this.action;
    }

    public void setValue(String value)
    {
        this.value = value;
    }

    public String getValue()
    {
        return this.value;
    }

    public void setCopyfrom(String p)
    {
        this.copyfrom = p;
    }

    public String getCopyfrom()
    {
        return this.copyfrom;
    }

    public void setCopyto(String p)
    {
        this.copyto = p;
    }

    public String getCopyto()
    {
        return this.copyto;
    }

}


@XmlRootElement(name = "paths")
@XmlAccessorType(FIELD)
public class paths
{

    private List<path> paths;

    public paths()
    {
        paths = new ArrayList<path>();
    }

    public List<path> getPaths()
    {
        return paths;
    }

    public void setPaths(List<path> paths)
    {
        this.paths = paths;
    }

    public void addPath(path p)
    {
        paths.add(p);
    }

}