Чтение и запись xml-схем
Содержание:
Резюме файла XSD
Эти файлы XSD можно просматривать с помощью пять существующего (-их) прикладных (-ого) программных (-ого) средств (-а), как правило, Microsoft Visual Studio, разработанного Microsoft Corporation. Оно связано с один основным (-и) типом (-ами) файла (-ов), но часто встречается в формате XML Schema Definition.
Большинство файлов XSD относится к Developer Files.
Просматривать файлы XSD можно с помощью операционных систем Windows, Mac и Linux. Они обычно находятся на настольных компьютерах (и ряде мобильных устройств) и позволяют просматривать и иногда редактировать эти файлы.
Рейтинг популярности данных файлов составляет «Низкий» и они обычно не используются.
Устранение неполадок
Частые проблемы с открытием XSD
Отсутствует Microsoft Visual Studio
При двойном щелчке XSD-файла может появиться диалоговое окно операционной системы с сообщением о том, что он «Не удается открыть этот тип файла». Обычно это означает, что Microsoft Visual Studio не установлен в %%os%%. Это не позволит вам дважды щелкнуть, чтобы открыть XSD-файл, потому что ОС не знает, как его обрабатывать.
Совет: Если вам извстна другая программа, которая может открыть файл XSD, вы можете попробовать открыть данный файл, выбрав это приложение из списка возможных программ.
Устаревший Microsoft Visual Studio
Файл XML Schema Definition несовместим с Microsoft Visual Studio, поскольку возможно, установлена неправильная версия. Вам нужно будет загрузить более новую версию Microsoft Visual Studio, если у вас нет правильной версии. Основной причиной этой проблемы является то, что файл XML Schema Definition был создан другой (более новой) версией Microsoft Visual Studio, чем установленная.
Совет . Иногда вы можете получить подсказки о правильной версии программы, щелкнув правой кнопкой мыши XSD-файл, выбрав «Свойства» и посмотрев информацию о версии.
В первую очередь проблемы, возникающие при открытии XSD-файлов, связаны с тем, что на вашем компьютере установлена неправильная версия Microsoft Visual Studio.
Предполагая, что у вас установлена правильная версия Microsoft Visual Studio, другие проблемы могут помешать вам открывать XSD-файлы. Могут возникнуть и другие проблемы — не связанные с программным обеспечением — мешающие вам открывать XSD-файлы. Другие причины, способствующие этому:
Как открыть XML-файл
Существует несколько способов открыть XML-файл напрямую. Вы можете открывать и редактировать их с помощью любого текстового редактора, просматривать их с помощью любого веб-браузера или использовать веб-сайт, который позволяет просматривать, редактировать и даже конвертировать их в другие форматы.
Используйте текстовый редактор при регулярной работе с XML
Поскольку XML-файлы – это просто текстовые файлы, их можно открыть в любом текстовом редакторе. Однако, многие текстовые редакторы, такие как Notepad, просто не предназначены для отображения XML-файлов с их правильной структурой. Это может быть полезно для быстро ознакомления с содержанием XML-файла. Но, существуют более удобные инструменты для работы с ними.
- Щелкните правой кнопкой мыши файл XML, который вы хотите открыть, выберите Открыть с помощью в контекстном меню, а затем выберите Блокнот.
Примечание: мы используем Windows, но то же самое справедливо и для других операционных систем. Найдите хороший сторонний текстовый редактор, предназначенный для поддержки XML-файлов.
- Файл открывается, но, как вы можете видеть, он теряет большую часть своего форматирования и записывает всё в две строки.
- Таким образом, блокнот может быть полезен для быстрой проверки XML-файла. Но, гораздо удобнее использовать более продвинутый инструмент, такой как Notepad++, который подсвечивает синтаксис и формат файла, как это можно ожидать.
Вот тот же XML-файл, открытый в Notepad++
Использование веб-браузера для просмотра XML-файла
Если Вам не нужно редактировать XML-файл, но просто нужно просмотреть содержимое, с этой задачей справиться ваш браузер. Более того, ваш веб-браузер, скорее всего, уже настроен как стандартное средство просмотра XML-файлов. Таким образом, двойной щелчок XML-файла должен открыть его в браузере.
Если нет, вы можете щелкнуть правой кнопкой мыши файл, чтобы найти варианты его открытия с любым другим приложением. Просто выберите ваш веб-браузер из списка программ.
Когда файл откроется, вы должны увидеть хорошо структурированные данные. Это не так красиво, как цветной вид, который вы получаете в Notepad++, но гораздо лучше, чем блокнот.
Использование онлайн-редактора для XML-файлов
Если вы хотите редактировать случайный XML-файл и не хотите загружать новый текстовый редактор, или Вам нужно конвертировать XML-файл в другой формат, существует несколько достойных онлайн-редакторов XML, доступных бесплатно.
Для примера используем CodeBeautify.org. Страница разделена на три раздела. Слева находится XML-файл, с которым вы работаете. В середине вы найдете несколько функций. Справа вы увидите результаты некоторых вариантов, которые вы можете выбрать.
Например, на рисунке ниже слева находится наш полный XML-файл, а на панели результатов отображается представление в виде дерева, так как мы нажали кнопку Tree View посередине.
Используйте кнопку Browse для загрузки XML-файла с вашего компьютера или кнопку Load URL для извлечения XML из интернет-источника
Кнопка Tree View отображает данные в хорошо отформатированной древовидной структуре на панели результатов, со всеми тегами, выделенными оранжевым цветом, и атрибутами справа от тегов.
Beatify отображает ваши данные в аккуратном, легко читаемом виде.
Кнопка Minify отображает ваши данные, используя наименьшее количество пробелов. Эта функция будет разместить каждый каждый кусок данных на одной строке. Это пригодится при попытке сделать файл меньше, что сэкономит некоторое пространство.
И, наконец, Вы можете использовать кнопку XML to JSON для преобразования XML в формат JSON, и кнопку Export to CSV для сохранения данных в виде файла значений, разделенных запятыми, или кнопку Download для загрузки любых изменений, которые вы сделали в новом XML-файле.
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>
Разделите схемы
Предыдущий метод дизайн очень прост, но может быть трудно читать и поддерживать, когда документы являются сложными.
Следующий метод дизайн основан на определении всех элементов и атрибутов, а затем ссылаясь на них , используя 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>
Использование именованных типов
Способ третий дизайн определяет классы или типы, что позволяет повторно использовать определения элементов. Это делается путем именования элементов 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.
❮ Предыдущая Следующая Глава ❯
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.
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; } }
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" НаимОрг="ООО«Мосавтогруз»"/>
Группа Показатели
Показатели группы используются для определения связанных наборов элементов.
Элемент группы
групп элементов определяются с декларацией группы, как это:
<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>
❮ Предыдущая Следующая Глава ❯