суббота, 14 апреля 2018 г.

XML. Конспект 3

Использование XML-схем не отменяет использование DTD.
Полноценный dateTime: <x>2013-06-11T18:40:45</x>
date: <x>2013-06-11</x>
time: <x>18:40:45</x>
gMonthDay: <x>--06-1111T18:40:45</x>
gDay: <x>---11T18:40:45</x>
duration: <x>P5Y3M21D</x> - 5 лет 3 месяца 21 день



base64binary - например, картинка.
hexBinary - 16-ричный формат.
anyURI - URL или URI (например, ссылка на сайт).
QName - qualified name (уточненное имя), т.е что-то : что-то


Можно писать так.
Файл 3_1.xml
<?xml version="1.0" encoding="UTF-8"?>
<root
xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="3_1.xsd">

<name>Ivan</name>
<myAge>12</myAge>
</root>

Файл 3_1.xsd
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="myRootType">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="myAge" type="xs:integer"/>
</xs:sequence>
</xs:complexType>

<xs:element name="root" type="myRootType"/>
</xs:schema>

Контейнеры комплексных типов
Комплексный тип - структура, набор. Композитор указания взаимоотношения этих элементов.
Контейнеры-объединители (композиторы).
sequence - последовательность, жесткий порядок следования. Если нет жестких условий, то всегда нужно выбирать sequence.
Т.к. у choice и all есть ограничения.
choice - один из, т.е мы можем использовать один из элементов name или myAge.
all - все в любой последовательности.

sequence пример:
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="myAge" type="xs:integer"/>
</xs:sequence>

ПРИМЕРЫ
Файл 3_2.xml
<?xml version="1.0" encoding="utf-8"?>
<personal xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="3_2.xsd">
<employee>
<phone>123-45-78</phone>
<email>john@smith.com</email>
<name>
<first>John</first>
<last>Smith</last>
<middle>K.</middle>
</name>
</employee>
</personal>

Файл 3_2.xds
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="personal">
<xs:complexType>
<xs:sequence>
<xs:element name="employee">
<xs:complexType>
<xs:all>
<xs:element name="phone" type="xs:string"/>
<xs:element name="email" type="xs:string"/>
<xs:element name="name">
<xs:complexType>
<xs:sequence>
<xs:element name="first" type="xs:string"/>
<xs:element name="last" type="xs:string"/>
<xs:element name="middle" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:all>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

Оптимизируем файл 3_2.xds
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:complexType name="NameType">
<xs:sequence>
<xs:element name="first" type="xs:string"/>
<xs:element name="last" type="xs:string"/>
<xs:element name="middle" type="xs:string"/>
</xs:sequence>
</xs:complexType>

<xs:complexType name="EmployeeType">
<xs:all>
<xs:element name="phone" type="xs:string"/>
<xs:element name="email" type="xs:string"/>
<xs:element name="name" type="NameType"/>
</xs:all>
</xs:complexType>

<xs:complexType name="PersonalType">
<xs:sequence>
<xs:element name="employee" type="EmployeeType"/>
</xs:sequence>
</xs:complexType>

<xs:element name="personal" type="PersonalType"/>

</xs:schema>

ЛАБОРАТОРНАЯ РАБОТА
lab-3.1.xml
<?xml version="1.0" encoding="utf-8"?>
<person xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="lab-3.1.xsd">
<name>
<first>John</first>
<last>Smith</last>
</name>
<age>18</age>
<birthday>2000-04-15</birthday>
</person>

lab-3.1.xds
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="NameType">
<xs:sequence>
<xs:element name="first" type="xs:string"/>
<xs:element name="last" type="xs:string"/>
</xs:sequence>
</xs:complexType>

<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="NameType"/>
<xs:element name="age" type="xs:positiveInteger"/>
<xs:element name="birthday" type="xs:date"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

Количество вхождений элементов
<xsl:persons>
<xsd:complexType>
<xsd:sequence>
<xsd:element name="person" type="PersonType"
minOccurs="0" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>
</xsl:persons>

minOccurs - минимальное вхождение
maxOccurs - максимальное вхождение
unbounded - неограниченно

ПРИМЕРЫ
Файл 3_3.xml
<?xml version="1.0" encoding="utf-8"?>
<personal xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="3_3.xsd">
<employee>
<phone>123-45-78</phone>
<email>john@smith.com</email>
<name>
<first>John</first>
<last>Smith</last>
<middle>K.</middle>
</name>
</employee>
<employee>
<phone>123-45-79</phone>
<email>jey@smith.com</email>
<name>
<first>Jey</first>
<last>Smith</last>
<middle>M.</middle>
</name>
</employee>
<employee>
<phone>523-45-78</phone>
<email>jess@smith.com</email>
<name>
<first>Jess</first>
<last>Smith</last>
<middle>N.</middle>
</name>
</employee>
</personal>

Файл 3_3.xsd
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:complexType name="NameType">
<xs:sequence>
<xs:element name="first" type="xs:string"/>
<xs:element name="last" type="xs:string"/>
<xs:element name="middle" type="xs:string"/>
</xs:sequence>
</xs:complexType>

<xs:complexType name="EmployeeType">
<xs:all>
<xs:element name="phone" type="xs:string"/>
<xs:element name="email" type="xs:string"/>
<xs:element name="name" type="NameType"/>
</xs:all>
</xs:complexType>

<xs:element name="personal">
<xs:complexType>
<xs:sequence>
<xs:element name="employee" type="EmployeeType"
minOccurs="1" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>


</xs:schema>

ПРИМЕРЫ
Файл 3_3.xml
<?xml version="1.0" encoding="utf-8"?>
<personal xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="3_3.xsd">
<employee>
<phone>123-45-78</phone>
<email>john@smith.com</email>
<name>
<first>John</first>
<last>Smith</last>
<middle>K.</middle>
</name>
<age>25</age>
</employee>
<employee>
<phone>123-45-79</phone>
<email>jey@smith.com</email>
<name>
<first>Jey</first>
<last>Smith</last>
<middle>M.</middle>
</name>
</employee>
<employee>
<phone>523-45-78</phone>
<email>jess@smith.com</email>
<name>
<first>Jess</first>
<last>Smith</last>
<middle>N.</middle>
</name>
</employee>
</personal>

Файл 3_3.xsd
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:complexType name="NameType">
<xs:sequence>
<xs:element name="first" type="xs:string"/>
<xs:element name="last" type="xs:string"/>
<xs:element name="middle" type="xs:string"/>
</xs:sequence>
</xs:complexType>

<xs:complexType name="EmployeeType">
<xs:sequence>
<xs:element name="phone" type="xs:string"/>
<xs:element name="email" type="xs:string"/>
<xs:element name="name" type="NameType"/>
<xs:any minOccurs="0" /> <!-- Можем здесь описать что угодно -->
</xs:sequence>
</xs:complexType>

<xs:element name="age" type="xs:integer"/>

<xs:element name="personal">
<xs:complexType>
<xs:sequence>
<xs:element name="employee" type="EmployeeType"
minOccurs="1" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>


</xs:schema>

Определения типов
<xsd:complexType name="address">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="street" type="xsd:string" />
<xsd:element name="city" type="xsd:string" />
</xsd:sequence>
<xsd:attribute name="phone" type="xsd:string" use="optional"/>
</xsd:complexType>

optional - необязательный.
Атрибут не элемента, а типа, поэтому выносится за контейнер вниз.

ПРИМЕР. Зададим employee id.
Файл 3_3.xml
<?xml version="1.0" encoding="utf-8"?>
<personal xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="3_3.xsd">
<employee id="E-1">
<phone>123-45-78</phone>
<email>john@smith.com</email>
<name>
<first>John</first>
<last>Smith</last>
<middle>K.</middle>
</name>
<age>25</age>
</employee>
<employee id="E-2">
<phone>123-45-79</phone>
<email>jey@smith.com</email>
<name>
<first>Jey</first>
<last>Smith</last>
<middle>M.</middle>
</name>
</employee>
<employee id="E-3">
<phone>523-45-78</phone>
<email>jess@smith.com</email>
<name>
<first>Jess</first>
<last>Smith</last>
<middle>N.</middle>
</name>
</employee>
</personal>

Файл 3_3.xsd
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:complexType name="NameType">
<xs:sequence>
<xs:element name="first" type="xs:string"/>
<xs:element name="last" type="xs:string"/>
<xs:element name="middle" type="xs:string"/>
</xs:sequence>
</xs:complexType>

<xs:complexType name="EmployeeType">
<xs:sequence>
<xs:element name="phone" type="xs:string"/>
<xs:element name="email" type="xs:string"/>
<xs:element name="name" type="NameType"/>
<xs:any minOccurs="0" /> <!-- Можем здесь описать что угодно -->
</xs:sequence>
<xs:attribute name="id" type="xs:ID" use="required"/>
</xs:complexType>

<xs:element name="age" type="xs:integer"/>

<xs:element name="personal">
<xs:complexType>
<xs:sequence>
<xs:element name="employee" type="EmployeeType"
minOccurs="1" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>

</xs:schema>

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

<xsd:element name="phone">
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="mobile" type="xsd:string" use="optional"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>

ПРИМЕР. Сделаем атрибут mobile у телефона.
Файл 3_3.xsd
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:complexType name="NameType">
<xs:sequence>
<xs:element name="first" type="xs:string"/>
<xs:element name="last" type="xs:string"/>
<xs:element name="middle" type="xs:string"/>
</xs:sequence>
</xs:complexType>

<xs:complexType name="EmployeeType">
<xs:sequence>
<xs:element name="phone">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="mobile" default="false" type="xs:boolean" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="email" type="xs:string"/>
<xs:element name="name" type="NameType"/>
<xs:any minOccurs="0" /> <!-- Можем здесь описать что угодно -->
</xs:sequence>
<xs:attribute name="id" type="xs:ID" use="required"/>
</xs:complexType>

<xs:element name="age" type="xs:integer"/>

<xs:element name="personal">
<xs:complexType>
<xs:sequence>
<xs:element name="employee" type="EmployeeType"
minOccurs="1" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>

</xs:schema>

Файл 3_3.xml
<?xml version="1.0" encoding="utf-8"?>
<personal xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="3_3.xsd">
<employee id="E-1">
<phone mobile="true">123-45-78</phone>
<email>john@smith.com</email>
<name>
<first>John</first>
<last>Smith</last>
<middle>K.</middle>
</name>
<age>25</age>
</employee>
<employee id="E-2">
<phone mobile="false">123-45-79</phone>
<email>jey@smith.com</email>
<name>
<first>Jey</first>
<last>Smith</last>
<middle>M.</middle>
</name>
</employee>
<employee id="E-3">
<phone>523-45-78</phone>
<email>jess@smith.com</email>
<name>
<first>Jess</first>
<last>Smith</last>
<middle>N.</middle>
</name>
</employee>
</personal>

Группы элементов.
Группа - это абстракция.
Композитор группы (xs:sequence) должен совпадать с композитором типа.
<xs:group name="acct">
<xs:sequence>
<xs:element name="descript" type="xs:string"/>
<xs:element name="number" type="xs:string"/>
<xs:element name="balance" type="xs:decimal"/>
</xs:sequence>
</xs:group>

<xs:complexType name="checkingAcct">
<xs:sequence>
<xs:group ref="acct" /> <!-- Похоже на инклюдник -->
</xs:sequence>
<xs:attribute name="status" type="xs:string"/>
</xs:complexType>

Рассмотрим пример с файлом, в котором перечисляются клиенты и клерки. Они отличаются адресом.
Файл demo-3.xml
<?xml version="1.0" encoding="utf-8"?>
<root
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="demo-3.xsd">

<customers>
<customer>
<id>A-1</id>
<name>Вася</name>
<addr>Адрес</addr>
</customer>
<customer>
<id>A-2</id>
<name>Петя</name>
<addr>Адрес</addr>
</customer>
</customers>

<clerks>
<clerk>
<id>B-1</id>
<name>Саша</name>
<office>Адрес</office>
</clerk>
<clerk>
<id>B-2</id>
<name>Сережа</name>
<office>Адрес</office>
</clerk>
</clerks>
</root>

Файл demo-3.xds
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:group name="personGroup">
<xs:sequence>
<xs:element name="id" type="xs:ID" />
<xs:element name="name" type="xs:string" />
</xs:sequence>
</xs:group>

<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="customers">
<xs:complexType>
<xs:sequence>
<xs:element name="customer" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:group ref="personGroup" />
<xs:element name="addr" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>

</xs:element>
<xs:element name="clerks">
<xs:complexType>
<xs:sequence>
<xs:element name="clerk" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:group ref="personGroup" />
<xs:element name="office" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>


</xs:element>
</xs:schema>


Расширение типов. Похоже на ООП.
В этом примере мы расширяем баланс минимальным балансом. Немного похоже на группы.
<xsd:complexType name="acct">
<xsd:sequence>
<xsd:element name="description" type="xsd:string"/>
<xsd:element name="number" type="xsd:string"/>
<xsd:element name="type" type="acctTypeCode"/>
<xsd:element name="balance" type="xsd:decimal"/>
</xsd:sequence>
<xsd:attribute name="status" type="xsd:string"/>
</xsd:complexType>

<xsd:complexType name="savingsAcct">
<xsd:complexContent>
<xsd:extension base="acct">
<xsd:sequence>
<xsd:element name="minimumBalance" type="xsd:decimal" />
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>

Пример расширения типов.
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">


<!-- Базовый тип персона -->
<xs:complexType name="personType">
<xs:sequence>
<xs:element name="id" type="xs:ID" />
<xs:element name="name" type="xs:string" />
</xs:sequence>
</xs:complexType>

<!-- Тип клиент -->
<xs:complexType name="customerType">
<xs:complexContent>
<xs:extension base="personType">
<xs:sequence>
<xs:element name="addr" type="xs:string" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>

<!-- Тип клерк -->
<xs:complexType name="clerkType">
<xs:complexContent>
<xs:extension base="personType">
<xs:sequence>
<xs:element name="office" type="xs:string" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>


<!-- Описание самой структуры -->
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="customers">
<xs:complexType>
<xs:sequence>
<xs:element name="customer" type="customerType" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>

</xs:element>
<xs:element name="clerks">
<xs:complexType>
<xs:sequence>
<xs:element name="clerk" type="clerkType"  maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>


</xs:element>
</xs:schema>

ПРИМЕР.
Файл demo-4.xml
<?xml version="1.0" encoding="utf-8"?>
<root
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="demo-4.xsd">

<customer>
<id>A-2</id>
<name>Петя</name>
<age>24</age>
<birthday>2008-05-12</birthday>
<phone>240-45-45</phone>
<day>Понедельник</day>
</customer>

</root>

Файл demo-4.xsd
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:simpleType name="ageType">
<xs:restriction base="xs:integer"> <!-- restriction - ограничение -->
<xs:maxInclusive value="100" /> <!-- максимальный возраст 100 -->
<xs:minExclusive value="12" /> <!-- минимальный возраст 12 -->
</xs:restriction>
</xs:simpleType>

<xs:simpleType name="phoneType">
<xs:restriction base="xs:string">
<xs:pattern value="\d{3}-?\d{2}-?\d{2}" />
</xs:restriction>
</xs:simpleType>

<xs:element name="birthday">
<xs:simpleType>
<xs:restriction base="xs:date">
<xs:minInclusive value="1950-01-01" /> <!-- maxInclusive можно применять к датам -->
<xs:maxInclusive value="2008-12-31" />
</xs:restriction>
</xs:simpleType>
</xs:element>

<xs:simpleType name="daysType">
<xs:restriction base="xs:string">
<xs:enumeration value="Воскресение" /> <!-- enumeration - только что-то из перечисляемых значений -->
<xs:enumeration value="Понедельник" />
<xs:enumeration value="Вторник" />
<xs:enumeration value="Среда" />
<xs:enumeration value="Четверг" />
<xs:enumeration value="Пятница" />
<xs:enumeration value="Суббота" />
</xs:restriction>
</xs:simpleType>



<!-- Описание самой структуры -->
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="customer">
<xs:complexType>
<xs:sequence>
<xs:element name="id" type="xs:ID" />
<xs:element name="name" type="xs:string" />
<xs:element name="age" type="ageType" />
<xs:element name="birthday" type="xs:date">
<xs:element name="phone" type="phoneType" />
<xs:element name="day" type="daysType" />

</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

Расширение простых типов.
<xsd:simpleType name="loginType">
<xsd:restriction base="xsd:string">
<xsd:minLength value="3" />
<xsd:maxLength value="12" />
</xsd:restriction>
</xsd:simpleType>

Полезные программы: altova и liquid xml 

Лабораторная работа.
Файл test.xml
<timeTable>
<offices>
<office code="РА">
<name>Комплекс "Радио"</name>
<address>ул. Бакунинская, д.71</address>
</office>
<office code="БК">
<name>Комплекс "Бакунинский"</name>
<address>ул. Радио, д.24</address>
</office>
</offices>

<lesson no="1">
<date>2012-03-21</date>
<time>18:30:00</time>
</lesson>
<lesson no="2">
<date>2012-03-22</date>
<time>19:30:00</time>
</lesson>
<lesson no="3">
<date>2012-03-24</date>
<time>19:30:00</time>
</lesson>
</timeTable>


Файл test.xsd
<?xml version="1.0" encoding="utf-8"?>
<!-- Created with Liquid XML Studio Developer Edition 9.0.11.3078 (http://www.liquid-technologies.com) -->
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="timeTable">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" name="offices">
          <xs:complexType>
            <xs:sequence>
              <xs:element minOccurs="0" maxOccurs="unbounded" name="office">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element minOccurs="0" name="name" type="xs:string" />
                    <xs:element minOccurs="0" name="address" type="xs:string" />
                  </xs:sequence>
                  <xs:attribute name="code" type="xs:string" use="optional" />
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element minOccurs="0" maxOccurs="unbounded" name="lesson">
          <xs:complexType>
            <xs:sequence>
              <xs:element minOccurs="0" name="date" type="xs:date" />
              <xs:element minOccurs="0" name="time" type="xs:time" />
            </xs:sequence>
            <xs:attribute name="no" type="xs:unsignedByte" use="optional" />
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>


Комментариев нет:

Отправить комментарий

Materialize-css. Футер

Сделаем футер и прижмем к низу страницы. Документация: https://materializecss.com/footer.html