Как создать повторно используемый тип «Штат США» в схеме XML?
-
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 в верхней части схемы.