如何用XSD定义JAXB的double数组列表及二维数组列表
在XSD中定义适配JAXB的数组列表类型
以下是针对List<double[]>和List<double[][]>两种类型的具体实现方案:
一、适配List<double[]>的XSD定义
JAXB原生支持将xs:list类型映射为Java一维数组,结合重复元素即可实现列表效果。
XSD代码实现
<!-- 定义一维double数组的简单类型,对应Java的double[] --> <xs:simpleType name="DoubleArray"> <xs:list itemType="xs:double"/> </xs:simpleType> <!-- 定义对应List<double[]>的复杂类型 --> <xs:complexType name="DoubleArrayList"> <xs:sequence> <!-- 通过maxOccurs="unbounded"实现列表,每个元素对应一个double[] --> <xs:element name="array" type="DoubleArray" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType>
Java映射说明
使用XJC工具生成Java类后,DoubleArrayList会自动包含List<double[]>类型的属性。如果是在自定义Java类中直接映射,可通过以下注解实现:
@XmlElementWrapper(name = "doubleArrayList") @XmlElement(name = "array") private List<double[]> myDoubleArrayList;
二、适配List<double[][]>的XSD定义
二维数组需要嵌套结构配合JAXB适配器实现,因为原生XSD无法直接映射为Java二维数组,需通过中间类型转换。
步骤1:编写XSD结构
<!-- 复用一维double数组类型 --> <xs:simpleType name="DoubleArray"> <xs:list itemType="xs:double"/> </xs:simpleType> <!-- 定义XML层面的二维数组包装类型,对应Java的List<double[]> --> <xs:complexType name="Double2DArrayXml"> <xs:sequence> <xs:element name="row" type="DoubleArray" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> <!-- 定义对应List<double[][]>的复杂类型 --> <xs:complexType name="Double2DArrayList"> <xs:sequence> <xs:element name="matrix" type="Double2DArrayXml" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType>
步骤2:实现JAXB适配器
编写XmlAdapter将Double2DArrayXml与double[][]互相转换:
import javax.xml.bind.annotation.adapters.XmlAdapter; import java.util.List; public class Double2DArrayAdapter extends XmlAdapter<Double2DArrayXml, double[][]> { // 将XML结构转换为Java二维数组 @Override public double[][] unmarshal(Double2DArrayXml xml) throws Exception { List<double[]> rows = xml.getRow(); return rows.toArray(new double[rows.size()][]); } // 将Java二维数组转换为XML结构 @Override public Double2DArrayXml marshal(double[][] matrix) throws Exception { Double2DArrayXml xml = new Double2DArrayXml(); for (double[] row : matrix) { xml.getRow().add(row); } return xml; } }
步骤3:绑定适配器
如果使用XJC生成类,需通过绑定文件(binding.xjb)指定适配器:
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" version="2.1"> <jaxb:bindings schemaLocation="your-schema.xsd"> <jaxb:bindings node="//xs:complexType[@name='Double2DArrayXml']"> <jaxb:typeAdapter value="com.yourpackage.Double2DArrayAdapter"/> </jaxb:bindings> </jaxb:bindings>
执行XJC命令生成类:
xjc -b binding.xjb your-schema.xsd
如果是自定义Java类,直接在字段上添加注解:
@XmlElementWrapper(name = "double2DArrayList") @XmlElement(name = "matrix") @XmlJavaTypeAdapter(Double2DArrayAdapter.class) private List<double[][]> myTwoDimensionList;
内容的提问来源于stack exchange,提问作者István D
相关产品推荐
相关产品推荐

