Как создать повторно используемый тип «Штат США» в схеме XML? - PullRequest
4 голосов
/ 23 октября 2008

У меня есть схема XML, которая включает несколько адресов:

<xs:element name="personal_address" maxOccurs="1">
  <!-- address fields go here -->
</xs:element>
<xs:element name="business_address" maxOccurs="1">
  <!-- address fields go here -->
</xs:element>

В каждом элементе адреса я включаю перечисление «Штат США»:

<xs:simpleType name="state">
    <xs:restriction base="xs:string">
        <xs:enumeration value="AL" />
        <xs:enumeration value="AK" />
        <xs:enumeration value="AS" />
                ....
            <xs:enumeration value="WY" />
        </xs:restriction>
</xs:simpleType>

Как мне написать один раз перечисление «Штат США» и повторно использовать его в каждом из моих элементов адреса? Заранее извиняюсь, если это вопрос n00b - я никогда раньше не писал XSD.

Мой начальный удар в следующем:

<xs:element name="business_address" maxOccurs="1">
  <!-- address fields go here -->
  <xs:element name="business_address_state" type="state" maxOccurs="1"></xs:element>
</xs:element>

Ответы [ 2 ]

5 голосов
/ 23 октября 2008

Я думаю, что вы на правильном пути. Я думаю, что это больше связано с пространствами имен XML. Попробуйте следующее:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.example.org/foo"
    xmlns:tns="http://www.example.org/foo"
    elementFormDefault="qualified">
    <xs:element name="business_address">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="business_address_state"
                    type="tns:state" maxOccurs="1" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:simpleType name="state">
        <xs:restriction base="xs:string">
            <xs:enumeration value="AL" />
            <xs:enumeration value="AK" />
            <xs:enumeration value="AS" />
            <xs:enumeration value="WY" />
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

Обратите внимание, что типом является tns: состояние не просто состояние

И тогда вот как вы бы это использовали:

<?xml version="1.0" encoding="UTF-8"?>
<business_address xmlns="http://www.example.org/foo"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.example.org/foo foo.xsd ">
    <business_address_state>AL</business_address_state>
</business_address>

Обратите внимание, что этот XML использует пространство имен по умолчанию, такое же как и targetNamespace XSD

2 голосов
/ 24 октября 2008

Хотя пространства имен помогают организовывать схемы и предотвращать конфликты, это не пространство имен выше, что позволяет для повторного использования, это размещение типа как непосредственного потомка корня это делает его глобальным типом. (Используется в пространстве имен без квалификатора пространства имен и в любом месте, где пространство имен tns видимо с квалификатором tns:.)

Я предпочитаю конструировать свои схемы, следуя подходу «Эдемского сада», который максимизирует повторное использование как элементов, так и типов (а также может облегчить внешнюю логическую ссылку на тщательно созданный уникальный тип / элемент, например, из словаря данных в базе данных.

Обратите внимание, что, хотя шаблон схемы «Райский сад» предлагает максимальное повторное использование, он также включает в себя большую часть работы. В нижней части этого поста я привел ссылки на другие шаблоны, описанные в серии блогов.

& бык; Подход Эдемского сада http://blogs.msdn.com/skaufman/archive/2005/05/10/416269.aspx

Использует модульный подход, определяя все элементы глобально, и подобно подходу Венецианской слепоты все определения типов объявляются глобально. Каждый элемент глобально определен как непосредственный дочерний элемент узла, а его атрибут типа может быть установлен на один из названных сложных типов.
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="TargetNamespace" xmlns:TN="TargetNamespace" xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="BookInformation" type="BookInformationType"/>
    <xs:complexType name="BookInformationType">
        <xs:sequence>
            <xs:element ref="Title"/>
            <xs:element ref="ISBN"/>
            <xs:element ref="Publisher"/>
            <xs:element ref="PeopleInvolved" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="PeopleInvolvedType">
        <xs:sequence>
            <xs:element name="Author"/>
        </xs:sequence>
    </xs:complexType>
    <xs:element name="Title"/>
    <xs:element name="ISBN"/>
    <xs:element name="Publisher"/>
    <xs:element name="PeopleInvolved" type="PeopleInvolvedType"/>
</xs:schema>
Преимущество этого подхода заключается в том, что схемы можно использовать повторно. Поскольку элементы и типы определены глобально, оба доступны для повторного использования. Этот подход предлагает максимальное количество повторно используемого контента. Недостатками являются то, что схема является многословной. Это было бы уместно при создании общих библиотек, в которых вы можете не делать никаких предположений относительно области применения элементов и типов схемы и их использования в других схемах, особенно в отношении расширяемости и модульности.


Поскольку каждый отдельный тип и элемент имеют одно глобальное определение, эти канонические частицы / компоненты могут быть связаны один к одному с идентификаторами в базе данных. И хотя на первый взгляд может показаться утомительной текущей ручной задачей по поддержанию связей между текстовыми частицами / компонентами XSD и базой данных, SQL Server 2005 может фактически генерировать идентификаторы компонентов канонической схемы с помощью оператора

CREATE XML SCHEMA COLLECTION

http://technet.microsoft.com/en-us/library/ms179457.aspx

И наоборот, для построения схемы из канонических частиц SQL Server 2005 предоставляет

SELECT xml_schema_namespace function

http://technet.microsoft.com/en-us/library/ms191170.aspx

са · не · я · кал Связанные с математикой. (уравнения, координаты и т. д.) «в простейшей или стандартной форме» http://dictionary.reference.com/browse/canonical

Другие, более простые в построении, но менее изменяемые / более «денормализованные / избыточные» шаблоны схем включают

* 1 034 * & бык; Подход "Русская кукла" http://blogs.msdn.com/skaufman/archive/2005/04/21/410486.aspx
Схема имеет один единственный глобальный элемент - корневой элемент. Все остальные элементы и типы постепенно встраиваются все глубже, давая ему имя, потому что каждый тип вписывается в один над ним. Так как элементы в этом дизайне объявлены локально, они не будут повторно использоваться через импорт или включать операторы. * * 1 042 & бык; Подход с ломтиками салями http://blogs.msdn.com/skaufman/archive/2005/04/25/411809.aspx
Все элементы определены глобально, но определения типов определены локально. Таким образом, другие схемы могут повторно использовать элементы. При таком подходе глобальный элемент с локально определенным типом предоставляет полное описание содержимого элементов. Этот информационный «фрагмент» объявляется индивидуально, а затем объединяется обратно и может также объединяться для создания других схем.

& бык; Подход Венецианского Слепого http://blogs.msdn.com/skaufman/archive/2005/04/29/413491.aspx

СимИлар к подходу «Русская кукла» в том, что они оба используют один глобальный элемент. Подход Venetian Blind описывает модульный подход, называя и определяя все определения типов глобально (в отличие от подхода Slice Salami, который объявляет элементы глобально и типы локально). Каждый глобально определенный тип описывает отдельную «планку» и может использоваться другими компонентами. Кроме того, все локально объявленные элементы могут быть квалифицированными для пространства имен или неквалифицированными для пространства имен (планки могут быть «открыты» или «закрыты») в зависимости от значения атрибута elementFormDefault в верхней части схемы.
...