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.

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

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 34

      +13
      «Такой подход позволяет объектно-ориентированным языкам программирования легко создавать объекты в памяти»

      Легко — это последнее слово, которое приходит в голову при работе с xsd. Сложно описывать (RelaxNG проще и гибче), сложно валидировать, очень сложно программно создавать новый xml по имеющемуся xsd.

      XSD полезен. Статьи про XSD нужны. Но не используйте в статьях про одно из самых безумных порождений W3C слова «легко», «просто», «универсально», я вас умоляю.
      • UFO just landed and posted this here
          +4
          C удовольствием познакомился с RELAX NG года 4 назад, жаль практики мало. Рекомендую всем, кому необходимо описывать структуру XML документов, обратить внимание на RELAX NG. У знакомых с BNF сложностей в освоении RELAX NG не будет. У RELAX NG есть два синтаксиса — XML и компактный.

          Смое смешное, что класс документов, которые можно описать с помощью RELAX NG, шире, чем тех, которые можно описать с помощью XML Schema! Готов поискать пруфлинк.

          Пример из статьи на RELAX NG (Compact Syntax):

          # Это — документационный комментарий к стартовому правилу
          start = HabraUser

          ## Главный элемент схемы. Описывает пользователя хабра
          HabraUser = element habra_user {
          attribute user_name { text },
          attribute first_name { text },
          attribute last_name { text },
          # не помню, есть ли встроенный тип для даты
          attribute date_of_birth {… },
          # для ограничений используются дополнительные средства типа Schematron
          attribute register_date { text },
          ( ContactInfo )*,
          ( Blogs )*
          }

          ContactInfo = ICQ | LinkedIn

          Blogs = element blog_name {… }
          element blog_url {… }
            +1
            Да, обратить внимание на Relax NG пожалуй стоит, но вот Compact Syntax — это ведь не XML. Значит нужен дополнительный парсер, собственно, зачем это нужно?

            А обычный Relax NG, конечно, проще XSD, но не на столько, чтобы переходить на него. XSD — это стандарт, который очень широко распространен. Гораздо шире, чем RNG.

            Любой технологии — свое место.
              0
              Без очень дорогого редактора читать XSD очень тяжко. А RNG/RNC влёт преобразуется один в другой, и очень легко читается.
                +1
                Преимущества текстовых форматов общеизвестны. XML проще парсить, но сложнее писать. Для редактирования XML удобный редактор найти можно, но все равно скорее всего будут вылезать задачи, когда придется смотреть на голый XML (например, дифы сравнивать). А парсер для RNG есть, RNGOM проект на dev.java.net.

                Мне сложно придумать что-либо менее достойное быть стандартом, чем XSD :) Этот тот случай, когда я бы приложил усилия, чтоб сменить мейнстрим, чем плыть в нем.
              0
              Прямо сейчас пишу xsd-парсер, это ад. over 20 встроенных базовых типов.
                0
                100%!!) слова «легко», «просто», «универсально» нельзя ставить в одно предложение с XML,XSL,XSD не в коем случае! исключение только если перед ними стоит частица НЕ!)
                0
                Стоит отметить то что XSD можно использовать при ручном редактировании XML в Visual Studio, напр. есть инструкция как там организовать авто-дополнение кода при работе с SVG документами.
                • UFO just landed and posted this here
                  –10
                  Унылый XML…
                    +6
                    Классно, только вот не 'XSD Schema', а 'XML Schema'. Или просто отдельно 'XSD'.
                      +4
                      Иногда ещё уточняют: «W3C XML Schema», т.к. существует и обобщающее понятие XML schema (со строчной s), включающее в себя XSD, RELAX NG и «даже» DTD.
                        0
                        Поправил, спасибо.
                        0
                        Тут особенно заметно, насколько XML многословен (в смысле «много букоф»).
                          0
                          Потому что он сочетает в себе не только данные, но и саму структуру данных.
                            0
                            Не, потому что, в частности, на каждый <foo:barbazqux ...> надо написать свой </foo:barbazqux>. И потому что имена атрибутов пишутся лишь для того, чтобы обозначить, что тут атрибут.
                              0
                              И это хорошо. Желающие могут назвать элементы в стиле <x:y42></x:y42> и получить экономию в размере ценой сотни лучей ненависти в свой адрес от тех, кто будет дебажить эти данные/ПО.
                                0
                                Многословность не в названии самих элементов, а в необходимости многословных закрывающих тегов и в обязательности наименования параметров-атрибутов.
                                  0
                                  Во всяком случае, когда отлаживаешься, при большой степени вложенности объектов это лучше, чем подсчитывать скобки (а-ля JSON, который очень write-only), количество символов/байт (а-ля Netstrings) или вообще пробелов (а-ля YAML, который больше подходит для статического задания структур). Человеколюбивей XML пока ничего не придумали(?)…

                                  К слову, в программах я часто пишу в стиле:
                                  if ( predicate_expr )
                                  {
                                  //… больше 20 строк кода…
                                  } // if ( predicate_expr )

                                  Иначе легко запутаться.
                            +3
                            Вы так говорите, как будто это что-то плохое.
                            0
                            А в чем картинку делали?
                              +1
                              Похоже что XmlSpy — есть такой продухт под Виндоуз.
                                0
                                А какой продукт есть не под Виндоуз? :)
                                Скоро буду писать документ про xml, хотелось бы автоматически дополнить такими полезными красивостями.
                                  +1
                                  В Eclipse есть дизайнер, но он очень уж специфичный. Больше ничего не нашёл. Есть ещё какой-то очень платный, но я его только мельком видел.
                                  • UFO just landed and posted this here
                                  +1
                                  XMLSpy. В конце статьи написано
                                    0
                                    Спасибо, не обратил внимание.
                                  +1
                                  копал на эту тему месяца два назад, вот классная ссылочка:
                                  www.citforum.ru/internet/xml/scheme/
                                  после прочтения сваял себе xsd-файлик, теперь в студии у меня автокомплит и проверка синтаксиса XML-файлов. сказка просто.
                                    +2
                                    О чем топик-то? О том, что «XSD это так клево и вот — поглядите я на вики статью нашел»?
                                      –2
                                      Статья — реальный пример, как нужно создавать XSD. Ничего подобного на хабре не было.
                                      +2
                                      очередной Hello, world…
                                        0
                                        Если написано просто о сложных вещах, о которых не все знают — это не значит плохо.

                                        Напишите лучше, все в Ваших руках.
                                        • UFO just landed and posted this here

                                      Only users with full accounts can post comments. Log in, please.