Elim的博客

用来记录一些原创性的总结


Elim

JAXB系列之XmlSchema

XmlSchema是定义在包上用来整体指定本包中的Class对应的XML的默认namespace的。它需要定义中包对应的package-info.java上的,如下示例。

@javax.xml.bind.annotation.XmlSchema(namespace="http://elim.com/jaxb")
package com.elim.jaxb.schema;

namespace用于指定本Schema对应的namespace,相当于Schema文件中的targetNamespace。除了namespace外,XmlSchema主要还可以指定以下信息:

以下是一个指定了这些信息的一个简单示例。

@javax.xml.bind.annotation.XmlSchema(namespace="http://elim.com/jaxb",
    elementFormDefault=XmlNsForm.UNQUALIFIED, 
    attributeFormDefault=XmlNsForm.UNQUALIFIED, 
    xmlns=@XmlNs(prefix="ab", namespaceURI="http://elim.com/jaxb/ab"))
package com.elim.jaxb.schema;

import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlNsForm;

基于上述配置使用schemagen生成schema文件时就会生成类似如下的内容:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema attributeFormDefault="unqualified"
    elementFormDefault="unqualified" version="1.0" targetNamespace="http://elim.com/jaxb"
    xmlns:ab="http://elim.com/jaxb/ab" xmlns:tns="http://elim.com/jaxb"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">

</xs:schema>

基于这样的配置使用JAXB进行对象marshal时会生成类似如下这样的结果,生成的XML都是自带schema的。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns3:root xmlns:ab="http://elim.com/jaxb/ab" xmlns:ns3="http://elim.com/jaxb">
    <prop1>value1</prop1>
    <prop2>value2</prop2>
    <ns3:sub1>
        <superProp1>superValue1</superProp1>
        <superProp2>superValue2</superProp2>
        <subProp1>value1</subProp1>
        <subProp2>value2</subProp2>
    </ns3:sub1>
</ns3:root>