求适配指定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
相关产品推荐
相关产品推荐

