Как создать повторно используемый тип «Штат США» в схеме XML?

StackOverflow https://stackoverflow.com/questions/227434

  •  03-07-2019
  •  | 
  •  

Вопрос

У меня есть схема 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>
Это было полезно?

Решение

Я думаю, что вы на правильном пути. Я думаю, что это больше связано с пространствами имен 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: state , а не просто state

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

<?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

Другие советы

В то время как пространства имен помогают поддерживать схемы организованы и предотвратить конфликты, это не пространство имен выше, которое позволяет использовать повторное использование, это размещение типа в качестве непосредственного ребенкаu003Cxs:schema> корень, который делает его глобальным типом.(Можно использовать внутри пространства имен без квалификатора пространства имен и из любого места, где пространство имен 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

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

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

Подход «Русская кукла» http://blogs.msdn.com/skaufman/archive/2005/04/21/410486.aspx

Схема имеет один единственный глобальный элемент — корневой элемент.Все остальные элементы и типы вложены все глубже, давая им имя, соответствующее тому, что каждый тип соответствует тому, что находится над ним.Поскольку элементы в этом проекте объявляются локально, их нельзя повторно использовать с помощью операторов импорта или включения.

Подход «Ломтик салями» http://blogs.msdn.com/skaufman/archive/2005/04/25/411809.aspx

Все элементы определяются глобально, но определения типов определяются локально.Таким образом, другие схемы могут повторно использовать элементы.При таком подходе глобальный элемент с его локально определенным типом обеспечивает полное описание содержимого элемента.Этот информационный «срез» объявляется индивидуально, а затем снова объединяется вместе, а также может быть объединен для построения других схем.

Подход жалюзи http://blogs.msdn.com/skaufman/archive/2005/04/29/413491.aspx

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top