用来记录一些原创性的总结
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>