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

求适配指定XML的XSD Schema,用于Java JAXB反序列化HashMap

适配指定XML与Java类的XSD Schema示例

修正后的XML(原XML存在标签闭合错误)

原XML中<someProperty2>prop2</someProperty3>标签不匹配,修正后完整XML如下:

<root>
    <someProperty>prop</someProperty>
    <myObject>
        <someProperty2>prop2</someProperty2>
        <someProperty3>prop3</someProperty3>
        <mapping>
            <entry>
                <key>key1</key>
                <value>value1</value>
            </entry>
            <entry>
                <key>key2</key>
                <value>value2</value>
            </entry>
        </mapping>
    </myObject>
    <myObject>
        <someProperty2>prop2</someProperty2>
        <someProperty3>prop3</someProperty3>
        <mapping>
            <entry>
                <key>key3</key>
                <value>value3</value>
            </entry>
        </mapping>
    </myObject>
</root>

期望的Java类结构

// Class 1
class Root {
   String someProperty;
   List<MyObject> myObjects;
}

// Class 2
class MyObject {
   String someProperty2;
   String someProperty3;
   Map<String, String> mapping;
}

适配的XSD Schema

以下是能让JAXB生成对应Java类的XSD,包含JAXB扩展注解实现Map类型映射:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
            jaxb:version="2.1">

    <xsd:element name="root" type="RootType"/>

    <xsd:complexType name="RootType">
        <xsd:sequence>
            <xsd:element name="someProperty" type="xsd:string"/>
            <!-- 重复元素对应List<MyObject> -->
            <xsd:element name="myObject" type="MyObjectType" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="MyObjectType">
        <xsd:sequence>
            <xsd:element name="someProperty2" type="xsd:string"/>
            <xsd:element name="someProperty3" type="xsd:string"/>
            <xsd:element name="mapping" type="MappingType"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="MappingType">
        <xsd:sequence>
            <xsd:element name="entry" type="EntryType" maxOccurs="unbounded"/>
        </xsd:sequence>
        <!-- JAXB扩展:将entry集合映射为Map<String, String> -->
        <xsd:annotation>
            <xsd:appinfo>
                <jaxb:property>
                    <jaxb:baseType name="java.util.Map"/>
                    <jaxb:key>
                        <jaxb:xpath>key/text()</jaxb:xpath>
                    </jaxb:key>
                    <jaxb:value>
                        <jaxb:xpath>value/text()</jaxb:value>
                    </jaxb:value>
                </jaxb:property>
            </xsd:appinfo>
        </xsd:annotation>
    </xsd:complexType>

    <xsd:complexType name="EntryType">
        <xsd:sequence>
            <xsd:element name="key" type="xsd:string"/>
            <xsd:element name="value" type="xsd:string"/>
        </xsd:sequence>
    </xsd:complexType>

</xsd:schema>

关键说明

  • List类型映射:通过maxOccurs="unbounded"标记myObject元素,JAXB自动生成List<MyObject>类型属性。
  • Map类型映射:借助JAXB的<jaxb:property>扩展,指定将MappingType内的entry集合转换为Map<String, String>,关联XML中<key>和<value>的文本内容。
  • XML错误修正:原XML的标签闭合错误必须修正,否则会导致反序列化失败。

生成Java类命令

使用JDK自带的xjc工具生成类:

xjc your-schema.xsd -d src/main/java

内容的提问来源于stack exchange,提问作者SWAT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 12:45:26