Опубликован: 14.11.2006 | Доступ: свободный | Студентов: 5899 / 533 | Оценка: 4.18 / 3.74 | Длительность: 16:37:00
ISBN: 978-5-9556-0085-7
Лекция 10:

Работа с XML

< Лекция 9 || Лекция 10: 123456 || Лекция 11 >

Файлы определения схемы документа

Согласно современному стандарту, валидный документ должен соответствовать связанному с ним файлу XSD (XML Schema Definition) — файлу определения схемы XML, который определяет конкретный язык, то есть описывает, какие элементы и типы могут появляться в документе. Схемы XSD призваны заменить DTD (Document Type Definition), разница между ними заключается в том, что файлы XSD сами тоже используют синтаксис XML. Схемы XSD позволяют определить, какие теги разрешены, обязательны они или нет, могут ли повторяться в документе и так далее. Таким образом, XML описывает данные, а XSD — структуру этих данных, или метаданные. В терминах программирования, XSD — описание типов, в то время как в XML-файле описаны объекты этих типов. По адресу http://www.w3.org/TR/2003/WD-xmlschema-11-req-20030121/ находится рабочий проект стандарта XSD 1.1.

Файл описания схемы начинается с описания префикса пространства имен, который включается затем во все элементы этого файла. Адрес http://tempuri.org предназначается для задания URI для пространств имен ASP .NET:

<xs:schema id="XMLSchema2" targetNamespace= 
"http://tempuri.org/XMLSchema2.xsd" 
           elementFormDefault="qualified" 
  xmlns="http://tempuri.org/XMLSchema2.xsd" 
  xmlns:mstns="http://tempuri.org/XMLSchema2.xsd" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema">

Создавая схемы XSD, можно:

1. декларировать элементы и атрибуты.

<xs:element name="Author" type="xs:string" default="Пушкин" 
minOccurs="1" maxOccurs="1" />

Например, это определение задает, что элемент "Author" строкового типа, должен появляться один и только один и раз, и если он не указан, то принимает значение "Пушкин".

<xs:element name="Child" type=" xs:string" 
maxOccurs="unbounded"/>

Параметр maxOccurs="unbounded" указывает, что элемент может встречаться любое количество раз.

Параметр ref позволяет ссылаться на уже описанный в данном файле глобальный элемент или атрибут, чтобы избежать повторного описания одних и тех же элементов.

2. определить простые и сложные типы.

В XSD есть предопределенные типы — примерно такие же, как в .NET. Во время работы приложения они преобразуются в типы .NET. На их основании можно строить сложные типы, похожие на структуры языков программирования. Сложный тип состоит из последовательности описаний элементов. Определим сложный тип:

<xs:complexType name="Quote">
    <xs:sequence>
      <xs:element name="Text" type="xs:string" minOccurs="1" 
maxOccurs="1" />
      <xs:element name="Author" type="xs:string" default="Пушкин" 
minOccurs="1" maxOccurs="1" />
    </xs:sequence>
  </xs:complexType>

Тег <xs:sequence> определяет, что элементы в данном типе должны появляться в заданном порядке. Если бы использовался тег <xs:all>, то порядок появления элементов мог бы быть любым.

Тег <xs:choice> похож на структуру с вариантами. Он определяет, что в элементе данного типа должен быть только один из вложенных элементов:

<xs:complexType name="StateProvinceType">
  <xs:choice>
    <xs:element name="State" type="xs:string"/>
    <xs:element name="Province" type="xs:string"/>
  </xs:choice>
</xs:complexType>

Простые типы тоже строятся на основе стандартных типов, накладывая разные ограничения. Типы могут быть глобальными или вложенными в определение элементов. В предыдущем примере определен глобальный сложный тип Quote.

Глобальный тип можно использовать в определении элементов:

<xs:element name="Quote" type="Quote" maxOccurs="unbounded" />

В следующем примере определен простой тип, вложенный в определение элемента MyValue:

<xs:element name="MyValue" type="MyInteger"/>
<xs:simpleType name="MyInteger">
   <xs:restriction base="xs:positiveInteger">
      <xs:minInclusive value="1"/>
      <xs:maxInclusive value="10"/>
   </xs:restriction>
</xs:simpleType>

Значениями этого типа могут быть целые положительные числа от 1 до 10.

Простой тип может быть перечислением:

<xs:simpleType name="Answers">
    <xs:restriction base="xs:string">
      <xs:enumeration value="yes">
      </xs:enumeration>
      <xs:enumeration value="no" />
      <xs:enumeration value="don't know" />
    </xs:restriction>
  </xs:simpleType>

3. добавлять новые группы и группы атрибутов.

В определении сложного типа могут фигурировать атрибуты. Предположим, мы хотим построить схему такого файла:

<?xml version="1.0" encoding="utf-8" ?>
<FilmChoices>
  <Film Title='Броненосец "Потемкин"'>
    <Year>1925</Year>
    <Director>Эйзенштейн</Director></Film>
  <Film Title="Война и мир">
    <Year>1967</Year>
    <Director>Сергей Бондарчук</Director> </Film>
  <Film Title ="Девятая рота"> 
    <Year>2005</Year>
    <Director>Федор Бондарчук</Director> </Film>
</FilmChoices>

Необходимо потребовать наличие атрибута Title:

<xs:attribute name="Title" type="xs:string"  use="required"/>

Атрибуты могут быть только простых типов.

4. добавлять аннотации.

Аннотации позволяют вставлять описание существующих элементов — таким образом, в файл добавляется документация:

<xs:complexType name="Quote">
    <xs:annotation>
      <xs:documentation>
        Цитаты разных авторов
      </xs:documentation>
    </xs:annotation>

<xs:documentation> предназначается для читателей файла, а <xs:appinfo> — для обрабатывающих файл программ.

Полное описание синтаксиса XSD можно прочитать по адресу http://www.w3.org/2001/XMLSchema.xsd.

Редактировать XSD-файлы в Visual Studio 2005 можно и через исходный код, и с помощью дизайнера. Для XML -документа можно автоматически сгенерировать соответствующую ему схему. В окне свойств XML-документа можно задать как файл схемы, так и файл преобразования. В таком случае студия автоматически проверяет файл на соответствие схеме и IntelliSense даже подставляет теги из этого файла.

< Лекция 9 || Лекция 10: 123456 || Лекция 11 >
Алексей Савельев
Алексей Савельев

https://technet.microsoft.com/en-us/library/ms143221(v=sql.105).aspx

Денис Прокофьев
Денис Прокофьев

Везде написано, что это самый независимый и простой в использовании навигационный элемент управления, что он работает сразу с web.sitemap и не требует определения SiteMapDataSource.

Моя карта сайта состоит из двух страниц, вложенных друг в друга. asp:Menu, asp:TreeView отбображаются как ожидалось, а вот asp:SiteMapPath - нет. Он не виден нигде. Однако на его месте формируется разметка: <span id="SiteMapPath1"><a href="#SiteMapPath1_SkipLink" style="position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden;">Проход по ссылкам навигации</a><a id="SiteMapPath1_SkipLink"></a></span> - т.е. элемент отрабатывает.

В словах xHTML это выглядит так: <asp:SiteMapPath ID="SiteMapPath1" runat="server" />. Причем не важно - внутри тега form или снаружи - всегда одинаково.

Т.к. другие нав. ЭУ работают через простой источник данных без ошибок, делаю вывод - карта составлена правильно. ИД: <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" />

Карта: <?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
  <siteMapNode url="~/L11_1_simplePage.aspx" title="Страница 1"  description="Простая страница 1." >
    <siteMapNode url="~/L11_1SimplePage2.aspx" title="Страница 2"  description="Простая страница 2" />
  </siteMapNode>
</siteMap>

Почему так происходит? Вроде делаю все по примерам. VS Community 2015. NetFramework в проекте: v4.0.30319