Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JAXB-包装类内列表的控制元素名称_Java_Jaxb - Fatal编程技术网

Java JAXB-包装类内列表的控制元素名称

Java JAXB-包装类内列表的控制元素名称,java,jaxb,Java,Jaxb,我有一个类包装一个列表和一些其他属性,在另一个类中,我有多个包装类型的实例。我知道我们可以通过向需要的元素添加XmlElement注释来控制元素的名称。是否有任何方法可以指定与使用包装类型的地方的包装类型的内容相对应的元素名称 例如,包装器类如下所示 @XmlAccessorType(XmlAccessType.FIELD) public class Wrapper { @XmlElement(name = "name") private List<String> name

我有一个类包装一个列表和一些其他属性,在另一个类中,我有多个包装类型的实例。我知道我们可以通过向需要的元素添加XmlElement注释来控制元素的名称。是否有任何方法可以指定与使用包装类型的地方的包装类型的内容相对应的元素名称

例如,包装器类如下所示

@XmlAccessorType(XmlAccessType.FIELD)
public class Wrapper {

  @XmlElement(name = "name")
  private List<String> names;
  private String comment;

  //Getters and setters

}
我是否可以以某种方式对这些字段进行注释,以便将XML格式化为

<employeeNames>
  <employeeName>ABC DEF</employeeName>
  <employeeName>PQR STU</employeeName>
  <employeeName>ABC</employeeName>
</employeeNames>
<departmentNames>
  <departmentName>PQR</departmentName>
  <departmentName>PQR STU</departmentName>
  <departmentName>MNO</departmentName>
</departmentNames>

ABC DEF
PQR STU
基础知识
PQR
PQR STU
MNO

我知道,如果没有包装器,直接使用列表,我可以使用
@xmlementwrapper
@xmlementref
注释来构建这样的XML。

唯一想到的是,您可以像这样使用
@xmlementref
而不是
@xmlementwrapper

@XmlElementRef(name = "name")
private List<JAXBElement<String>> names;
你可以试试这个:

@XmlAccessorType(XmlAccessType.FIELD)
public class Wrapper {
    @XmlElements({
            @XmlElement(name = "employeeName", type = EmployeeName.class),
            @XmlElement(name = "departmentName", type = DepartmentName.class),
    })
    private List<Name> names;
    private String comment;

    public void setNames(List<Name> names) {
        this.names = names;
    }
}
它们都实现了一个功能不多的接口:

public interface Name {  }

我在包装器中将您的
列表
更改为
列表
,因为如果employeeName和departmentName都是String类型,封送处理将无法区分它们。

这将强制为包装器的每次使用创建单独的类型(并用另一种类型替换字符串)。在我的例子中,这不是一个好方法,因为前面提到的JAXB注释类并不是专门用于XML生成的。无法更改包装中的类型。
@XmlAccessorType(XmlAccessType.FIELD)
public class Wrapper {
    @XmlElements({
            @XmlElement(name = "employeeName", type = EmployeeName.class),
            @XmlElement(name = "departmentName", type = DepartmentName.class),
    })
    private List<Name> names;
    private String comment;

    public void setNames(List<Name> names) {
        this.names = names;
    }
}
@XmlAccessorType(XmlAccessType.FIELD)
public class EmployeeName implements Name {
    @XmlValue
    private String name;

    public EmployeeName(String name) {
        this.name = name;
    }
}
public interface Name {  }