Введение в схемы xsd с заметками (sqlxml 4.0)
Содержание:
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»).
Разделите схемы
Предыдущий метод дизайн очень прост, но может быть трудно читать и поддерживать, когда документы являются сложными.
Следующий метод дизайн основан на определении всех элементов и атрибутов, а затем ссылаясь на них , используя ref атрибут.
Вот новый дизайн файла схемы («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 файле кодировка объявляется в декларации:
<?xml version="1.0" encoding="windows-1251"?>
Часто можно столкнуться с ситуацией, когда текстовый редаткор некорректно распознает кодировку и отображает кракозябры. В такой случае, необходимо выбрать кодировку вручную, для этого выполните:
Программа | Кодировка |
---|---|
Notepad++ | «Документ → Кодировка» |
Geany | «Документ → Установить кодировку» |
Firefox | «Вид → Кодировка» |
Chrome | «Настройка → Дополнительные инструменты → Кодировка» |
Разновидности 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 |
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 ❯
Referencing Schema
Take a look at the following Referencing Schema −
<?xml version = "1.0"?> <class xmlns = "http://www.tutorialspoint.com" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://www.tutorialspoint.com student.xsd"> <student rollno = "393"> <firstname>Dinkar</firstname> <lastname>Kad</lastname> <nickname>Dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>Vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>Jasvir</firstname> <lastname>Singh</lastname> <nickname>Jazz</nickname> <marks>90</marks> </student> </class>
xmlns = "http://www.tutorialspoint.com"
The above fragment specifies default namespace declaration. This namespace is used by the schema validator check that all the elements are part of this namespace. It is optional.
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://www.tutorialspoint.com student.xsd">
After defining the XMLSchema-instance xsi, use schemaLocation attribute. This attribute has two values, namespace and location of XML Schema, to be used separated by a space. It is optional.
students.xml
<?xml version = "1.0"?> <class> <student rollno = "393"> <firstname>Dinkar</firstname> <lastname>Kad</lastname> <nickname>Dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>Vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>Jasvir</firstname> <lastname>Singh</lastname> <nickname>Jazz</nickname> <marks>90</marks> </student> </class>
students.xsd
<?xml version = "1.0"?> <xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema"> <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>
XSDValidator.java
import java.io.File; import java.io.IOException; import javax.xml.XMLConstants; import javax.xml.transform.stream.StreamSource; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import javax.xml.validation.Validator; import org.xml.sax.SAXException; public class XSDValidator { public static void main(String[] args) { if(args.length !=2){ System.out.println("Usage : XSDValidator <file-name.xsd> <file-name.xml>" ); } else { boolean isValid = validateXMLSchema(args,args); if(isValid){ System.out.println(args + " is valid against " + args); } else { System.out.println(args + " is not valid against " + args); } } } public static boolean validateXMLSchema(String xsdPath, String xmlPath){ try { SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); Schema schema = factory.newSchema(new File(xsdPath)); Validator validator = schema.newValidator(); validator.validate(new StreamSource(new File(xmlPath))); } catch (IOException e){ System.out.println("Exception: "+e.getMessage()); return false; } catch(SAXException e1){ System.out.println("SAX Exception: "+e1.getMessage()); return false; } return true; } }
Документа 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») .
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 имеют особые значения и являются служебными. Если вы поместите,
например, символ внутри XML элемента, то будет
сгенерирована ошибка, так как парсер интерпретирует его, как начало
нового элемента.
В примере ниже будет сгенерирована ошибка, так как в значении атрибута содержатся символы и .
<НПЮЛ ИННЮЛ="7718962261" КПП="771801001" НаимОрг="ООО<Мосавтогруз>"/>
Также ошибка будет сгенерирована и в слудющем примере, если название организации взять в обычные кавычки (английские двойные):
<НПЮЛ ИННЮЛ="7718962261" КПП="771801001" НаимОрг="ООО"Мосавтогруз""/>
Чтобы ошибки не возникали, нужно заменить символ на его
сущность. В XML существует 5 предопределенных сущностей:
Таблица I.1 — Сущности
Сущность
Символ
Значение
меньше, чем
больше, чем
амперсанд
апостроф
кавычки
Примечание
Только символы и строго запрещены в XML. Символ допустим, но лучше его всегда заменять на сущность.
Таким образом, корректными будут следующие формы записей:
<НПЮЛ ИННЮЛ="7718962261" КПП="771801001" НаимОрг="ООО"Мосавтогруз""/>
или
<НПЮЛ ИННЮЛ="7718962261" КПП="771801001" НаимОрг="ООО«Мосавтогруз»"/>
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>
Использование именованных типов
Способ третий дизайн определяет классы или типы, что позволяет повторно использовать определения элементов. Это делается путем именования элементов 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.
❮ Предыдущая Следующая Глава ❯
Структура языка XML
Да, мы не ошиблись: XML – это язык, но не программирования, а разметки. Можно сказать, что это аналог баз данных, но изначально этот инструмент разрабатывался специально для использования в веб-пространстве, поэтому его структура отличается от классических БД и, скорее, напоминает язык HTML. Но сходство это внешнее, заключающееся в наличие так называемых тегов – меток, которые обозначают начало и конец определённой структуры данных.
Поскольку XML создавался как универсальный расширяемый язык разметки, который действительно стал стандартом, его понимают многие программы и приложения, причём независимо от платформы.
Более того, формат можно использовать для обмена данными между различным программным обеспечением, а также для создания других, узкоспециализированных языков разметки (для работы с математическими, бухгалтерскими, медицинскими и прочими данными).
В качестве примера рассмотрим конкретные разработки, основанные на XML:
- XHTML – язык разметки, используемый для создания веб-страниц и являющийся альтернативой HTML. В настоящее время развитие языка заморожено, новые версии больше не выпускаются, но практически все современные браузеры умеют интерпретировать файлы с таким расширением;
- WSDL – язык, ориентированный на описание веб-сервисов, представляет собой протокол, описывающий, каким образом получить доступ к определённому веб-сервису и какие операции при этом нужно выполнять;
- SVG – ещё один специфический язык, созданный на базе XML , специализирующийся на описании структуры векторной графики, позволяя легко масштабировать и обрабатывать такие элементы;
- OWL – язык описания структуры знаний. Используется как элемент ООП для организации взаимодействия между классами объектов.
Как видим, язык XML является универсальным инструментом, используемым в самых разных сферах веб-разработки. Рассмотрим, чем можно открыть файлы с расширением XML стандартными средствами операционной системы.
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.
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.