【问题标题】:JAXB - Mapping XML file to java classesJAXB - 将 XML 文件映射到 java 类
【发布时间】:2014-05-04 16:20:12
【问题描述】:

我有一个简单的 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") 吗?但是在这种情况下,这个名称将与根元素相同吗? 我应该如何正确地做到这一点?

提前感谢您的帮助

【问题讨论】:

    标签: java xml file jaxb mapping


    【解决方案1】:

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

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

    XmlElementWrapper 元素会生成 classless 标记。所以你可以写

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

      对于您当前的映射,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 用于在表示集合中项目的元素周围添加分组元素。如果您想详细了解它的功能,请查看我的博客上的以下内容:

      【讨论】:

        【解决方案3】:

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

        要生成你需要 jaxb.jar

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多