Статьи

JAXB (XJC) импортированные схемы и каталоги XML

XML-схема имеет мощный механизм, называемый «импорт». Импорт позволяет одной XML-схеме ссылаться на элементы и типы из другой XML-схемы. Это означает, что вы можете определить типы для представления часто используемой информации один раз и импортировать эти типы в другие схемы XML. Как и любой мощный инструмент, механизм импорта также обладает способностью причинять боль. В этой статье я покажу, как использовать каталог XML для устранения проблем при использовании инструмента XJC JAXB для генерации классов из схемы XML с импортом.

XML-схемы

Следующие XML-схемы будут использоваться для этого поста. Импортированные схемы ( address.xsd и phone-number .xsd) находятся в подкаталоге с именем « import » относительно customer.xsd .

customer.xsd (корневая XML-схема)

Это корневая XML-схема, из которой мы будем генерировать наши классы Java. Эта XML-схема содержит два оператора импорта:

  1. Первый импорт включает системный идентификатор, указывающий размещенное местоположение импортированной XML-схемы. Инструмент XJC JAXB может генерировать классы из размещенной схемы XML (см. Обработка каналов Atom с помощью JAXB ), но в этом примере схемы XML все еще находятся в стадии разработки и еще не размещены.
  2. Второй импорт вообще не включает системный идентификатор. Инструмент XJC не будет знать, где найти импортированную схему XML.

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
    targetNamespace="http://www.example.com/customer"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns="http://www.example.com/customer"
    xmlns:add="http://www.example.com/address"
    xmlns:phn="http://www.example.com/phone-number"
    elementFormDefault="qualified">

    <xs:import
        schemaLocation="http://www.example.com/address/address.xsd"
        namespace="http://www.example.com/address"/>

    <xs:import
        namespace="http://www.example.com/phone-number"/>

    <xs:element name="customer">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="name" type="xs:string"/>
                <xs:element ref="add:address"/>
                <xs:element ref="phn:phone-number"
                    minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

</xs:schema>
import / address.xsd (импортированная схема)

import / phone-number.xsd (импортированная схема)
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.example.com/phone-number"
    xmlns="http://www.example.com/phone-number"
    elementFormDefault="qualified">

    <xs:element name="phone-number">
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="xs:string">
                    <xs:attribute name="type" type="xs:string"/>
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>

</xs:schema>