Xml на основе xsd xml: Как создать XML и XSD схему и наоборот

Содержание

XSD — умный XML / Хабр

XSD — это язык описания структуры XML документа. Его также называют XML Schema. При использовании XML Schema XML парсер может проверить не только правильность синтаксиса XML документа, но также его структуру, модель содержания и типы данных.

Такой подход позволяет объектно-ориентированным языкам программирования легко создавать объекты в памяти, что, несомненно, удобнее, чем разбирать XML как обычный текстовый файл.

Кроме того, XSD расширяем, и позволяет подключать уже готовые словари для описания типовых задач, например веб-сервисов, таких как SOAP.

Стоит также упомянуть о том, что в XSD есть встроенные средства документирования, что позволяет создавать самодостаточные документы, не требующие дополнительного описания.

Рассмотрим в качестве примера XSD документ, описывающий часть структуры аккаунта на хабре.

Текст XSD схемы и XML документ, соответствующий этой схеме я не стал включать в статью из-за их размера.

Первая строчка схемы указывает, что документ является XML документом и использует кодировку UTF-8.

<?xml version="1.0" encoding="UTF-8"?>
Со следующей строки начинается описания главного элемента документа —
habra_user
.
<xs:element name="habra_user">
Строки, документирующие элемент:
  <xs:annotation>
   <xs:documentation>Главный элемент схемы. Описывает пользователя хабра</xs:documentation>
  </xs:annotation>
Тег <xs:complexType> описывает «сложный» тип данных user_name. При желании его можно вынести как отдельный тип данных, по аналогии с contact_info. Для этого, нужно блок <xs:complexType> перенести в <xs:schema> и указать атрибут name, а элементу задать атрибут type.

Элементы user_name, first_name, last_name имеют строковый тип и описывают пользователя, имя и фамилию владельца аккаунта.

Элемент date_of_birth имеет тип данных «дата» и описывает дату рождения.

Дату регистрации описывает register_date, имеющий собственный тип данных customDateTime. Значение этого тега будет задаваться с помощью атрибута value. На это указывают строки.

<xs:attribute name="value" use="required">
При этом атрибут — обязательный. Чтобы значение соответствовало требованиям, опишем «проверки»:
   <xs:simpleType>
    <xs:restriction base="xs:string">
     <xs:length value="19"/>
     <xs:pattern value="[1-2][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9] [0-2][0-9]:[0-5][0-9]:[0-5][0-9]"/>
    </xs:restriction>
   </xs:simpleType>
В таком случае длина строки будет всегда 19, это задано тегом <xs:length> и само значение будет соответствовать шаблону, указанным в теге
<xs:pattern>
.

Элементы contact_info и blog — массивы, на это указывает атрибут maxOccurs=«unbounded».

Тег <xs:choice> определяет то, что вложенным элементом будет один из элементов ICQ или linkedin.

Тег <xs:sequence> указывает на то, что вложенные элементы будут blog_name и blog_url именно в такой последовательности. Если последовательность не важна, то нужно использовать тег <xs:all>.

Дополнительно о XSD схемах можно почитать Wikipedia и W3C. Для создания макета была использована программа Altova XMLSpy.

Спасибо за внимание!

В чем разница между XML и XSD?


берите пример

<root>
  <parent>
     <child_one>Y</child_one>
     <child_two>12</child_two>
  </parent>
</root>

и создайте xsd для этого:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" 
xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="parent">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="child_one" type="xs:string" />
              <xs:element name="child_two" type="xs:int" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>


что невозможно с XSD: хотел бы написать его первым, так как список очень мал
1) Вы не можете проверить узел/атрибут, используя значение другого узла/атрибута.

2) это ограничение : элемент, определенный в XSD-файле, должен быть определен только с одним типом данных. [в приведенном выше примере, для <child_two> появляется в другом <parent> node, тип данных не может быть определен, кроме int.
3) Вы не можете игнорировать проверку элементов и атрибутов, т. е., если элемент/атрибут появляется в XML, он должен быть четко определен в соответствующем XSD. Хотя использование <xsd:any> позволяет, но у него есть свои правила. Соблюдение, которое приводит к ошибке проверки. Я пытался применить подобный подход и, конечно, не преуспел.—20—>вот Q & A


что возможно с XSD:
1) Вы можете проверить правильную иерархию узлов XML. [xsd определяет, какой ребенок должен находиться под каким родителем и т. д., соблюдение которого будет считаться ошибкой, в приведенном выше примере child_two не может быть непосредственным потомком root, но это ребенок тега «parent», который, в свою очередь, является дочерним узлом «root», существует иерархия..]

2)Вы можете определить тип данных значений узлов. [в приведенном выше примере child_two не может иметь никаких других данных, кроме числа]
3) Вы также можно определить пользовательские типы данных, [например, для node <month> возможные данные могут быть одним из 12 месяцев.. поэтому вам нужно определить все 12 месяцев в новом типе данных, записывая все имена 12 месяцев в качестве значений перечисления .. проверка показывает ошибку, если входной XML содержит любое другое значение, чем эти 12 значений .. ]
4) Вы можете поставить ограничение на появление элементов, используя minOccurs и maxOccurs, значения по умолчанию-1 и 1.

.. и многое другое …

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Theme: Overlay by Kaira Extra Text
Cape Town, South Africa