Краткое описание создания xml файла по xsd схеме на примере создания выгрузки статистической отчетности для фтс
Содержание:
- Введение в XML¶
- Разновидности XSD-файлов
- Сущности¶
- Create an XML Schema
- Element
- Syntax
- Создание XML-схемы
- Документа XML
- Индикаторы Заказать
- Использование именованных типов
- Verify the output
- XSD — Simple Types
- XSD — Complex Types
- Группа Показатели
- Using Named Types
- An XML Document
- Divide the Schema
- Поиск информации в XML файлах (XPath)¶
Введение в XML¶
XML ( англ. eXtensible Markup Language) — расширяемый язык разметки,
предназначенный для хранения и передачи данных.
Простейший XML-документ выглядит следующим образом:
<?xml version="1.0" encoding="windows-1251"?> <book category="WEB"> <title lang="en">Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> <price></price> </book>
Первая строка — это XML декларация. Здесь определяется версия XML (1.0) и кодировка файла. На следующей строке описывается корневой элемент документа (открывающий тег). Следующие 4 строки описывают дочерние элементы корневого элемента ( , , , ). Последняя строка определяет конец корневого элемента (закрывающий тег).
Документ XML состоит из элементов (elements). Элемент начинается открывающим тегом (start-tag) в угловых скобках, затем идет содержимое (content) элемента, после него записывается закрывающий тег (end-teg) в угловых скобках.
Информация, заключенная между тегами, называется содержимым или значением элемента: . Т.е. элемент принимает значение . Элементы могут вообще не принимать значения.
Элементы могут содержать атрибуты, так, например, открывающий тег имеет атрибут , который принимает значение . Значения атрибутов заключаются в кавычки (двойные или ординарные).
Некоторые элементы, не содержащие значений, допустимо записывать без закрывающего тега. В таком случае символ ставится в конце открывающего тега:
Разновидности XSD-файлов
Основная принадлежность в формате XSD
.XSD
Форматирование: | .xsd |
Группа: | XML Schema Definition |
Расширение XSD Файл формат файла, который в основном используется для файлов, которые содержат данные описания схемы XML. XML-схемы обеспечивают средства для определения структуры, содержания и семантики XML документов, а также позволяет машинам выполнять правила, сделанные людьми. В XSD файлы используются в качестве замены для Document Type Definition файлов (.dtd).
Программист: | Unknown Developer |
Дивизион: | Файлы разработчика |
Ключ реестра: | HKEY_CLASSES_ROOT\.xsd |
Программные обеспечения, открывающие XML Schema Definition:
Microsoft Visual Studio, разработчик — Microsoft Corporation
Windows |
Oxygen XML Editor 19, разработчик — Syncro Soft
Windows |
Mac |
Linux |
Liquid Technologies Liquid XML Studio, разработчик — Liquid Technologies
Windows |
Microsoft Office Open XML File Format Converter, разработчик — Microsoft Corporation
Mac |
Microsoft XML Notepad, разработчик — Microsoft Corporation
Windows |
Сущности¶
Некоторые символы в XML имеют особые значения и являются служебными. Если вы поместите,
например, символ внутри XML элемента, то будет
сгенерирована ошибка, так как парсер интерпретирует его, как начало
нового элемента.
В примере ниже будет сгенерирована ошибка, так как в значении атрибута содержатся символы и .
<НПЮЛ ИННЮЛ="7718962261" КПП="771801001" НаимОрг="ООО<Мосавтогруз>"/>
Также ошибка будет сгенерирована и в слудющем примере, если название организации взять в обычные кавычки (английские двойные):
<НПЮЛ ИННЮЛ="7718962261" КПП="771801001" НаимОрг="ООО"Мосавтогруз""/>
Чтобы ошибки не возникали, нужно заменить символ на его
сущность. В XML существует 5 предопределенных сущностей:
Таблица I.1 — Сущности
Сущность
Символ
Значение
меньше, чем
больше, чем
амперсанд
апостроф
кавычки
Примечание
Только символы и строго запрещены в XML. Символ допустим, но лучше его всегда заменять на сущность.
Таким образом, корректными будут следующие формы записей:
<НПЮЛ ИННЮЛ="7718962261" КПП="771801001" НаимОрг="ООО"Мосавтогруз""/>
или
<НПЮЛ ИННЮЛ="7718962261" КПП="771801001" НаимОрг="ООО«Мосавтогруз»"/>
Create an XML Schema
Now we want to create a schema for the XML document above.
We start by opening a new file that we will call «shiporder.xsd». To create the schema we could simply follow
the structure in the XML document and define each element as we find it. We will start with the standard XML declaration followed by the xs:schema element that defines a schema:
<?xml version=»1.0″ encoding=»UTF-8″ ?>
<xs:schema xmlns:xs=»http://www.w3.org/2001/XMLSchema»>…
</xs:schema>
In the schema above we use the standard namespace (xs), and the URI
associated with this namespace is the Schema language definition, which has the
standard value of http://www.w3.org/2001/XMLSchema.
Next, we have to define the «shiporder» element. This element has an
attribute and it contains other elements, therefore we consider it as a complex
type. The child elements of the «shiporder» element is surrounded by a
xs:sequence element that defines an ordered sequence of sub elements:
<xs:element name=»shiporder»>
<xs:complexType>
<xs:sequence>
…
</xs:sequence>
</xs:complexType>
</xs:element>
Then we have to define the «orderperson» element as a simple type (because it does
not contain any attributes or other elements). The type (xs:string) is prefixed
with the namespace prefix associated with XML Schema that indicates a predefined
schema data type:
<xs:element name=»orderperson» type=»xs:string»/>
Next, we have to define two elements that are of the complex type: «shipto» and
«item». We start by defining the «shipto» element:
<xs:element name=»shipto»>
<xs:complexType>
<xs:sequence>
<xs:element name=»name» type=»xs:string»/>
<xs:element name=»address» type=»xs:string»/>
<xs:element name=»city» type=»xs:string»/>
<xs:element name=»country» type=»xs:string»/>
</xs:sequence>
</xs:complexType>
</xs:element>
With schemas we can define the number of possible occurrences for an element
with the maxOccurs and minOccurs attributes. maxOccurs specifies the maximum
number of occurrences for an element and minOccurs specifies the minimum number
of occurrences for an element. The default value for both maxOccurs and
minOccurs is 1!
Now we can define the «item» element. This element can appear multiple times
inside a «shiporder» element. This is specified by setting the maxOccurs
attribute of the «item» element to «unbounded» which means that there can be as
many occurrences of the «item» element as the author wishes. Notice that the
«note» element is optional. We have specified this by setting the minOccurs
attribute to zero:
<xs:element name=»item» maxOccurs=»unbounded»>
<xs:complexType>
<xs:sequence>
<xs:element name=»title» type=»xs:string»/>
<xs:element name=»note» type=»xs:string» minOccurs=»0″/>
<xs:element name=»quantity» type=»xs:positiveInteger»/>
<xs:element name=»price» type=»xs:decimal»/>
</xs:sequence>
</xs:complexType>
</xs:element>
We can now declare the attribute of the «shiporder» element. Since
this is a required attribute we specify use=»required».
Note: The attribute declarations must always come last:
<xs:attribute name=»orderid» type=»xs:string» use=»required»/>
Here is the complete listing of the schema file called «shiporder.xsd»:
<?xml version=»1.0″ encoding=»UTF-8″ ?>
<xs:schema xmlns:xs=»http://www.w3.org/2001/XMLSchema»>
<xs:element name=»shiporder»>
<xs:complexType>
<xs:sequence>
<xs:element name=»orderperson» type=»xs:string»/>
<xs:element name=»shipto»>
<xs:complexType>
<xs:sequence>
<xs:element name=»name» type=»xs:string»/>
<xs:element name=»address» type=»xs:string»/>
<xs:element name=»city» type=»xs:string»/>
<xs:element name=»country» type=»xs:string»/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name=»item» maxOccurs=»unbounded»>
<xs:complexType>
<xs:sequence>
<xs:element name=»title» type=»xs:string»/>
<xs:element name=»note» type=»xs:string» minOccurs=»0″/>
<xs:element name=»quantity» type=»xs:positiveInteger»/>
<xs:element name=»price» type=»xs:decimal»/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name=»orderid» type=»xs:string» use=»required»/>
</xs:complexType>
</xs:element>
</xs:schema>
Element
Schema is the root element of XSD and it is always required.
<xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema">
targetNamespace = "http://www.tutorialspoint.com"
The above fragment specifies that elements used in this schema are defined in http://www.tutorialspoint.com namespace. It is optional.
xmlns = "http://www.tutorialspoint.com"
The above fragment specifies that default namespace is http://www.tutorialspoint.com.
elementFormDefault = "qualified"
The above fragment indicates that any elements declared in this schema must be namespace qualified before using them in any XML Document.It is optional.
Syntax
The basic syntax of a XSD is as follows −
<?xml version = "1.0"?> <xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema"> targetNamespace = "http://www.tutorialspoint.com" xmlns = "http://www.tutorialspoint.com" elementFormDefault = "qualified"> <xs:element name = 'class'> <xs:complexType> <xs:sequence> <xs:element name = 'student' type = 'StudentType' minOccurs = '0' maxOccurs = 'unbounded' /> </xs:sequence> </xs:complexType> </xs:element> <xs:complexType name = "StudentType"> <xs:sequence> <xs:element name = "firstname" type = "xs:string"/> <xs:element name = "lastname" type = "xs:string"/> <xs:element name = "nickname" type = "xs:string"/> <xs:element name = "marks" type = "xs:positiveInteger"/> </xs:sequence> <xs:attribute name = 'rollno' type = 'xs:positiveInteger'/> </xs:complexType> </xs:schema>
Создание XML-схемы
Теперь мы хотим создать схему для документа XML выше.
Мы начнем с открытия нового файла , который мы будем называть «shiporder.xsd» . Для того, чтобы создать схему мы могли бы просто следовать структуре в документе XML и определите каждый элемент, как мы находим его. Мы начнем со стандартной декларации XML с последующим хз: элемент схемы, который определяет схему:
<?xml version=»1.0″ encoding=»UTF-8″ ?>
<xs:schema xmlns:xs=»http://www.w3.org/2001/XMLSchema»>…
</xs:schema>
В схеме выше мы используем стандартные пространства имен (xs) , и URI , связанный с этим пространством имен является определение языка схемы, который имеет стандартное значение http://www.w3.org/2001/XMLSchema.
Далее, мы должны определить «shiporder» элемент. Этот элемент имеет атрибут и содержит другие элементы, поэтому мы рассматриваем его как сложный тип. Дочерние элементы «shiporder» элемент окружен хз: элемент последовательности , которая определяет упорядоченную последовательность субэлементов:
<xs:element name=»shiporder»>
<xs:complexType>
<xs:sequence>
…
</xs:sequence>
</xs:complexType>
</xs:element>
Затем мы должны определить «orderperson» элемент в качестве простого типа (так как она не содержит каких — либо атрибутов или других элементов). В типа (xs:string) с префиксом префикс пространства имен , связанного с XML — схемы , которая указывает заранее определенный тип данных схемы:
<xs:element name=»orderperson» type=»xs:string»/>
Далее, мы должны определить два элемента , которые имеют сложного типа: «shipto» и «item» . Мы начнем с определения «shipto» элемент:
<xs:element name=»shipto»>
<xs:complexType>
<xs:sequence>
<xs:element name=»name» type=»xs:string»/>
<xs:element name=»address» type=»xs:string»/>
<xs:element name=»city» type=»xs:string»/>
<xs:element name=»country» type=»xs:string»/>
</xs:sequence>
</xs:complexType>
</xs:element>
С помощью схем, которые мы можем определить количество возможных появлений для элемента с MaxOccurs и атрибутами MinOccurs. MaxOccurs определяет максимальное число вхождений для элемента и MinOccurs определяет минимальное число вхождений для элемента. Значение по умолчанию для обоих MaxOccurs и MinOccurs 1!
Теперь мы можем определить «item» элемент. Этот элемент может появляться несколько раз внутри «shiporder» элемента. Это определяется установкой maxOccurs атрибут «item» элемента «unbounded» , что означает , что там может быть много вхождений «item» элемент , как автор хочет
Обратите внимание на то, что «note» элемент не является обязательным. Мы определили это, установив minOccurs атрибут к нулю:
<xs:element name=»item» maxOccurs=»unbounded»>
<xs:complexType>
<xs:sequence>
<xs:element name=»title» type=»xs:string»/>
<xs:element name=»note» type=»xs:string» minOccurs=»0″/>
<xs:element name=»quantity» type=»xs:positiveInteger»/>
<xs:element name=»price» type=»xs:decimal»/>
</xs:sequence>
</xs:complexType>
</xs:element>
Теперь мы можем объявить атрибут «shiporder» элемента. Поскольку это обязательный атрибут мы указываем использование = «требуется».
Note: Заявления атрибутов всегда должны прийти в последний раз :
<xs:attribute name=»orderid» type=»xs:string» use=»required»/>
Вот полный список файла схемы под названием «shiporder.xsd» :
<?xml version=»1.0″ encoding=»UTF-8″ ?>
<xs:schema xmlns:xs=»http://www.w3.org/2001/XMLSchema»>
<xs:element name=»shiporder»>
<xs:complexType>
<xs:sequence>
<xs:element name=»orderperson» type=»xs:string»/>
<xs:element name=»shipto»>
<xs:complexType>
<xs:sequence>
<xs:element name=»name» type=»xs:string»/>
<xs:element name=»address» type=»xs:string»/>
<xs:element name=»city» type=»xs:string»/>
<xs:element name=»country» type=»xs:string»/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name=»item» maxOccurs=»unbounded»>
<xs:complexType>
<xs:sequence>
<xs:element name=»title» type=»xs:string»/>
<xs:element name=»note» type=»xs:string» minOccurs=»0″/>
<xs:element name=»quantity» type=»xs:positiveInteger»/>
<xs:element name=»price» type=»xs:decimal»/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name=»orderid» type=»xs:string» use=»required»/>
</xs:complexType>
</xs:element>
</xs:schema>
Документа XML
Давайте посмотрим на этот XML — документ под названием «shiporder.xml» :
<?xml version=»1.0″ encoding=»UTF-8″?>
<shiporder orderid=»889923″
xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance»
xsi:noNamespaceSchemaLocation=»shiporder.xsd»>
<orderperson>John Smith</orderperson>
<shipto>
<name>Ola Nordmann</name>
<address>Langgt 23</address>
<city>4000 Stavanger</city>
<country>Norway</country>
</shipto>
<item>
<title>Empire Burlesque</title>
<note>Special Edition</note>
<quantity>1</quantity>
<price>10.90</price>
</item>
<item>
<title>Hide your heart</title>
<quantity>1</quantity>
<price>9.90</price>
</item>
</shiporder>
Документ XML выше состоит из корневого элемента, «shiporder» , который содержит обязательный атрибут под названием «orderid» . «shiporder» элемент содержит три различных дочерних элемента: «orderperson» , «shipto» и «item» . «item» элемент появляется дважды, и он содержит «title» , необязательный «note» элемент, «quantity» , и «price» элемент.
Линия выше: Xmlns: XSI = «http://www.w3.org/2001/XMLSchema-instance» говорит XML-анализатору, что этот документ должен быть проверен на схеме. Линия: XSI: noNamespaceSchemaLocation = «shiporder.xsd» указывает , где находится схемы (here it is in the same folder as «shiporder.xml») что и (here it is in the same folder as «shiporder.xml») .
Индикаторы Заказать
Индикаторы заказа используются для определения порядка элементов.
Все Индикатор
<all> индикатор указывает , что дочерние элементы могут появляться в любом порядке, и что каждый дочерний элемент должен иметь место только один раз:
<xs:element name=»person»>
<xs:complexType>
<xs:all>
<xs:element name=»firstname» type=»xs:string»/>
<xs:element name=»lastname» type=»xs:string»/>
</xs:all>
</xs:complexType>
</xs:element>
Note: При использовании <all> индикатор вы можете установить <minOccurs> индикатор 0 или 1 , а <maxOccurs> индикатор может быть установлен только в 1 ( <minOccurs> и <maxOccurs> описаны ниже).
Выбор индикатора
<choice> индикатор указывает , что может происходить либо один дочерний элемент или другой:
<xs:element name=»person»>
<xs:complexType>
<xs:choice>
<xs:element name=»employee» type=»employee»/>
<xs:element name=»member» type=»member»/>
</xs:choice>
</xs:complexType>
</xs:element>
Индикатор чередования фаз
<sequence> индикатор указывает , что дочерние элементы должны появляться в определенном порядке:
<xs:element name=»person»>
<xs:complexType>
<xs:sequence>
<xs:element name=»firstname» type=»xs:string»/>
<xs:element name=»lastname» type=»xs:string»/>
</xs:sequence>
</xs:complexType>
</xs:element>
Использование именованных типов
Способ третий дизайн определяет классы или типы, что позволяет повторно использовать определения элементов. Это делается путем именования элементов simpleTypes и complexTypes, а затем указать на них через type атрибута элемента.
Вот уже третий дизайн файла схемы («shiporder.xsd») :
<?xml version=»1.0″ encoding=»UTF-8″ ?>
<xs:schema xmlns:xs=»http://www.w3.org/2001/XMLSchema»>
<xs:simpleType name=»stringtype»>
<xs:restriction base=»xs:string»/>
</xs:simpleType>
<xs:simpleType name=»inttype»>
<xs:restriction base=»xs:positiveInteger»/>
</xs:simpleType>
<xs:simpleType name=»dectype»>
<xs:restriction base=»xs:decimal»/>
</xs:simpleType>
<xs:simpleType name=»orderidtype»>
<xs:restriction base=»xs:string»>
<xs:pattern value=»{6}»/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name=»shiptotype»>
<xs:sequence>
<xs:element name=»name» type=»stringtype»/>
<xs:element name=»address» type=»stringtype»/>
<xs:element name=»city» type=»stringtype»/>
<xs:element name=»country» type=»stringtype»/>
</xs:sequence>
</xs:complexType>
<xs:complexType name=»itemtype»>
<xs:sequence>
<xs:element name=»title» type=»stringtype»/>
<xs:element name=»note» type=»stringtype» minOccurs=»0″/>
<xs:element name=»quantity» type=»inttype»/>
<xs:element name=»price» type=»dectype»/>
</xs:sequence>
</xs:complexType>
<xs:complexType name=»shipordertype»>
<xs:sequence>
<xs:element name=»orderperson» type=»stringtype»/>
<xs:element name=»shipto» type=»shiptotype»/>
<xs:element name=»item» maxOccurs=»unbounded» type=»itemtype»/>
</xs:sequence>
<xs:attribute name=»orderid» type=»orderidtype» use=»required»/>
</xs:complexType>
<xs:element name=»shiporder» type=»shipordertype»/>
</xs:schema>
Элемент ограничение указывает на то, что тип данных был получен из пространства имен типа данных XML-схемы W3C. Таким образом, следующий фрагмент означает, что значение элемента или атрибута должно быть значение строки:
<xs:restriction base=»xs:string»>
Элемент ограничение чаще используется, чтобы применить ограничения к элементам. Посмотрите на следующие строки из приведенной выше схеме:
<xs:simpleType name=»orderidtype»>
<xs:restriction base=»xs:string»>
<xs:pattern value=»{6}»/>
</xs:restriction>
</xs:simpleType>
Это указывает на то, что значение элемента или атрибута должно быть строкой, оно должно быть ровно шесть символов в строке, и эти символы должны быть числом от 0 до 9.
❮ Предыдущая Следующая Глава ❯
Verify the output
You’ll see the following result −
students.xml is valid against students.xsd
XSD — Simple Types
In this chapter, we’ll see Simple Types that XSD defines.
S.No. | Simple Type & Description |
---|---|
1 |
Simple Element can contain only text. It can not contain any other element. |
2 |
Attribute is itself a type and is used in Complex Element. |
3 |
Restriction defines the acceptable values of an XML element. |
XSD — Complex Types
Complex Element is an XML element which can contain other elements and/or attributes. We can create a complex element in two ways −
-
Define a complex type and then create an element using the type attribute
-
Define a complex type directly by naming
Define a Complex Type and then create an element using type attribute.
<xs:complexType name = "StudentType"> <xs:sequence> <xs:element name = "firstname" type = "xs:string"/> <xs:element name = "lastname" type = "xs:string"/> <xs:element name = "nickname" type = "xs:string"/> <xs:element name = "marks" type = "xs:positiveInteger"/> </xs:sequence> <xs:attribute name = 'rollno' type = 'xs:positiveInteger'/> </xs:complexType> <xs:element name = 'student' type = 'StudentType' />
Define a Complex Type directly by naming.
<xs:element name = "student"> <xs:complexType> <xs:sequence> <xs:element name = "firstname" type = "xs:string"/> <xs:element name = "lastname" type = "xs:string"/> <xs:element name = "nickname" type = "xs:string"/> <xs:element name = "marks" type = "xs:positiveInteger"/> </xs:sequence> <xs:attribute name = 'rollno' type = 'xs:positiveInteger'/> </xs:complexType> <xs:element>
Following is the list of Complex Types that XSD supports.
S.No. | Simple Type & Description |
---|---|
1 |
Complex Empty complex type element can only have attributes but no contents. |
2 |
Elements-Only complex type element can only contain elements |
3 |
Text-Only complex type element can only contain attribute and text. |
4 |
Mixed complex type element can contain element, attribute and text. |
5 |
Indicators controls the ways how elements are to be organized in an XML document. |
6 |
The <any> element is used for elements which are not defined by schema |
7 |
The <anyAttribute> attribute is used for attribute which are not defined by schema. |
String data types are used to represent characters in the XML documents.
Группа Показатели
Показатели группы используются для определения связанных наборов элементов.
Элемент группы
групп элементов определяются с декларацией группы, как это:
<xs:group name=»groupname»>
…
</xs:group>
Вы должны определить все, выбор, или последовательность элементов внутри декларации группы. Следующий пример определяет группу под названием «persongroup» , который определяет группу элементов , которые должны произойти в точной последовательности:
<xs:group name=»persongroup»>
<xs:sequence>
<xs:element name=»firstname» type=»xs:string»/>
<xs:element name=»lastname» type=»xs:string»/>
<xs:element name=»birthday» type=»xs:date»/>
</xs:sequence>
</xs:group>
После того, как вы определили группу, вы можете ссылаться на нее в другом определении, как это:
<xs:group name=»persongroup»>
<xs:sequence>
<xs:element name=»firstname» type=»xs:string»/>
<xs:element name=»lastname» type=»xs:string»/>
<xs:element name=»birthday» type=»xs:date»/>
</xs:sequence>
</xs:group>
<xs:element name=»person» type=»personinfo»/>
<xs:complexType name=»personinfo»>
<xs:sequence>
<xs:group ref=»persongroup»/>
<xs:element name=»country» type=»xs:string»/>
</xs:sequence>
</xs:complexType>
Группы атрибутов
Атрибут группы определяются с декларацией attributeGroup, как это:
<xs:attributeGroup name=»groupname»>
…
</xs:attributeGroup>
Следующий пример определяет атрибут группу под названием «personattrgroup» :
<xs:attributeGroup name=»personattrgroup»>
<xs:attribute name=»firstname» type=»xs:string»/>
<xs:attribute name=»lastname» type=»xs:string»/>
<xs:attribute name=»birthday» type=»xs:date»/>
</xs:attributeGroup>
После того как вы определили группы атрибутов, вы можете ссылаться на нее в другом определении, как это:
<xs:attributeGroup name=»personattrgroup»>
<xs:attribute name=»firstname» type=»xs:string»/>
<xs:attribute name=»lastname» type=»xs:string»/>
<xs:attribute name=»birthday» type=»xs:date»/>
</xs:attributeGroup>
<xs:element name=»person»>
<xs:complexType>
<xs:attributeGroup ref=»personattrgroup»/>
</xs:complexType>
</xs:element>
❮ Предыдущая Следующая Глава ❯
Using Named Types
The third design method defines classes or types, that enables us to reuse element
definitions. This is done by naming the simpleTypes and complexTypes elements,
and then point to them through the type attribute of the element.
Here is the third design of the schema file («shiporder.xsd»):
<?xml version=»1.0″ encoding=»UTF-8″ ?>
<xs:schema xmlns:xs=»http://www.w3.org/2001/XMLSchema»>
<xs:simpleType name=»stringtype»>
<xs:restriction base=»xs:string»/>
</xs:simpleType>
<xs:simpleType name=»inttype»>
<xs:restriction base=»xs:positiveInteger»/>
</xs:simpleType>
<xs:simpleType name=»dectype»>
<xs:restriction base=»xs:decimal»/>
</xs:simpleType>
<xs:simpleType name=»orderidtype»>
<xs:restriction base=»xs:string»>
<xs:pattern value=»{6}»/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name=»shiptotype»>
<xs:sequence>
<xs:element name=»name» type=»stringtype»/>
<xs:element name=»address» type=»stringtype»/>
<xs:element name=»city» type=»stringtype»/>
<xs:element name=»country» type=»stringtype»/>
</xs:sequence>
</xs:complexType>
<xs:complexType name=»itemtype»>
<xs:sequence>
<xs:element name=»title» type=»stringtype»/>
<xs:element name=»note» type=»stringtype» minOccurs=»0″/>
<xs:element name=»quantity» type=»inttype»/>
<xs:element name=»price» type=»dectype»/>
</xs:sequence>
</xs:complexType>
<xs:complexType name=»shipordertype»>
<xs:sequence>
<xs:element name=»orderperson» type=»stringtype»/>
<xs:element name=»shipto» type=»shiptotype»/>
<xs:element name=»item» maxOccurs=»unbounded» type=»itemtype»/>
</xs:sequence>
<xs:attribute name=»orderid» type=»orderidtype» use=»required»/>
</xs:complexType>
<xs:element name=»shiporder» type=»shipordertype»/>
</xs:schema>
The restriction element indicates that the datatype is derived from a W3C XML
Schema namespace datatype. So, the following fragment means that the value of
the element or attribute must be a string value:
<xs:restriction base=»xs:string»>
The restriction element is more often used to apply restrictions to elements.
Look at the following lines from the schema above:
<xs:simpleType name=»orderidtype»>
<xs:restriction base=»xs:string»>
<xs:pattern value=»{6}»/>
</xs:restriction>
</xs:simpleType>
This indicates that the value of the element or attribute must be a string, it must be exactly six characters in a row, and those characters must be a
number from 0 to 9.
❮ Previous
Next ❯
An XML Document
Let’s have a look at this XML document called «shiporder.xml»:
<?xml version=»1.0″ encoding=»UTF-8″?>
<shiporder orderid=»889923″
xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance»
xsi:noNamespaceSchemaLocation=»shiporder.xsd»>
<orderperson>John Smith</orderperson>
<shipto>
<name>Ola Nordmann</name>
<address>Langgt 23</address>
<city>4000 Stavanger</city>
<country>Norway</country>
</shipto>
<item>
<title>Empire Burlesque</title>
<note>Special Edition</note>
<quantity>1</quantity>
<price>10.90</price>
</item>
<item>
<title>Hide your heart</title>
<quantity>1</quantity>
<price>9.90</price>
</item>
</shiporder>
The XML document above consists of a root element, «shiporder»,
that contains a required attribute called «orderid». The «shiporder» element contains three
different child elements: «orderperson», «shipto» and «item». The «item» element
appears twice, and it contains a «title», an optional «note» element, a «quantity», and a «price»
element.
The line above: xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance» tells the XML parser that this document should be validated against a schema.
The line: xsi:noNamespaceSchemaLocation=»shiporder.xsd» specifies WHERE the schema resides (here it is in the same folder as «shiporder.xml»).
Divide the Schema
The previous design method is very simple, but can be difficult to read and maintain when documents are complex.
The next design method is based on defining all elements and attributes first, and then referring to them using the ref attribute.
Here is the new design of the schema file («shiporder.xsd»):
<?xml version=»1.0″ encoding=»UTF-8″ ?>
<xs:schema xmlns:xs=»http://www.w3.org/2001/XMLSchema»>
<!— definition of simple elements —>
<xs:element name=»orderperson» type=»xs:string»/>
<xs:element name=»name» type=»xs:string»/>
<xs:element name=»address» type=»xs:string»/>
<xs:element name=»city» type=»xs:string»/>
<xs:element name=»country» type=»xs:string»/>
<xs:element name=»title» type=»xs:string»/>
<xs:element name=»note» type=»xs:string»/>
<xs:element name=»quantity» type=»xs:positiveInteger»/>
<xs:element name=»price» type=»xs:decimal»/>
<!— definition of attributes —>
<xs:attribute name=»orderid» type=»xs:string»/>
<!— definition of complex elements —>
<xs:element name=»shipto»>
<xs:complexType>
<xs:sequence>
<xs:element ref=»name»/>
<xs:element ref=»address»/>
<xs:element ref=»city»/>
<xs:element ref=»country»/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name=»item»>
<xs:complexType>
<xs:sequence>
<xs:element ref=»title»/>
<xs:element ref=»note» minOccurs=»0″/>
<xs:element ref=»quantity»/>
<xs:element ref=»price»/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name=»shiporder»>
<xs:complexType>
<xs:sequence>
<xs:element ref=»orderperson»/>
<xs:element ref=»shipto»/>
<xs:element ref=»item» maxOccurs=»unbounded»/>
</xs:sequence>
<xs:attribute ref=»orderid» use=»required»/>
</xs:complexType>
</xs:element>
</xs:schema>
Поиск информации в XML файлах (XPath)¶
XPath ( англ. XML Path Language) — язык запросов к элементам
XML-документа. XPath расширяет возможности работы с XML.
XML имеет древовидную структуру. В документе всегда имеется корневой
элемент (инструкция к дереву отношения не имеет).
У элемента дерева всегда существуют потомки и предки, кроме корневого
элемента, у которого предков нет, а также тупиковых элементов (листьев
дерева), у которых нет потомков. Каждый элемент дерева находится на
определенном уровне вложенности (далее — «уровень»). У элементов на
одном уровне бывают предыдущие и следующие элементы.
Это очень похоже на организацию каталогов в файловой системе, и строки
XPath, фактически, — пути к «файлам» — элементам. Рассмотрим пример
списка книг:
<?xml version="1.0" encoding="windows-1251"?> <bookstore> <book category="COOKING"> <title lang="it">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </book> <book category="CHILDREN"> <title lang="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> <book category="WEB"> <title lang="en">Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> <price>39.95</price> </book> </bookstore>
XPath запрос вернет следующий результат:
<price>30.00</price> <price>29.99</price> <price>39.95</price>
Сокращенная форма этого запроса выглядит так: .
С помощью XPath запросов можно искать информацию по атрибутам. Например,
можно найти информацию о книге на итальянском языке: вернет .
Чтобы получить больше информации, необходимо модифицировать запрос вернет:
<book category="COOKING"> <title lang="it">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </book>
В приведенной ниже таблице представлены некоторые выражения XPath и
результат их работы: