JAXB - 将XML文件映射到java类

时间:2014-03-26 10:26:06

标签: java xml file jaxb mapping

我有简单的XML文件。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <DataTypes>
   <Type name="type_integer" type="integer" />
   <Type name="valid_string" type="string" />
</DataTypes>

我创建了两个类来将此文件映射到这些类。其中第一个应该对应DataTypes标签。我按如下方式定义了这个类:

@XmlRootElement(name = "DataTypes")
    public class DataTypes {

       private List<DataType> types;

       public List<DataType> getTypes() {
         return types;
       }

       public void setTypes(List<DataType> types) {
         this.types = types;
       }

}

第二个类对应于Type标签。我按如下方式定义了这个类:

@XmlAccessorType(XmlAccessType.FIELD)
public class DataType {

@XmlAttribute
private String name;

@XmlAttribute
private String type;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getType() {
    return type;
}

public void setType(String type) {
    this.type = type;
}
}

当我加载数据时,类型集合为空。我知道我应该在第一个类中使用@XmlElementWrapper注释进行集合,但它应该如何?这个注释应该看起来像@XmlElementWrapper(name =“DataTypes”)吗?但在这种情况下,此名称将与根元素相同? 我该如何正确地做到这一点?

提前感谢您的帮助

3 个答案:

答案 0 :(得分:1)

使用当前映射,JAXB需要以下XML:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<DataTypes>
   <types name="type_integer" type="integer" />
   <types name="valid_string" type="string" />
</DataTypes>

您只需要在DataTypes类中执行以下操作,以指定应使用Type元素,而不是从属性名称派生的默认types

   @XmlElement(name="Type")
   public List<DataType> getTypes() {
     return types;
   }

其他信息可以在我的博客上找到:


关于@XmlElementWrapper

@XmlElementWrapper用于在表示集合中项目的元素周围添加分组元素。如果您想了解更多信息,请查看我的博客中的以下内容:

答案 1 :(得分:1)

通过Blaise修改,你做得非常好。因此,使用它,您可以解析您的xml并获取您的类型 - 列表。

@XmlElement(name="Type")
public List<DataType> getTypes() {
  return types;
}

XmlElementWrapper元素会生成无类别标记。所以你可以写

@XmlElementWrapper(name = "TypesCol")
@XmlElement(name="Type")
public List<DataType> getTypes() {
  return types;
}

您可以像这样处理XML

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <DataTypes>
   <TypesCol>
     <Type name="type_integer" type="integer" />
     <Type name="valid_string" type="string" />
   </TypesCol>
</DataTypes>

没有TypesCol的课程。但是您需要引用根类DataTypes。因此DataTypes的包装器是一个有效的选项。

答案 2 :(得分:-2)

简单的方法是创建一个xsd文件,在其中添加所有元素或类型,然后就可以生成类文件。

要生成,您需要jaxb.jar