You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 07:33:11