Главная Обратная связь

Дисциплины:

Архитектура (936)
Биология (6393)
География (744)
История (25)
Компьютеры (1497)
Кулинария (2184)
Культура (3938)
Литература (5778)
Математика (5918)
Медицина (9278)
Механика (2776)
Образование (13883)
Политика (26404)
Правоведение (321)
Психология (56518)
Религия (1833)
Социология (23400)
Спорт (2350)
Строительство (17942)
Технология (5741)
Транспорт (14634)
Физика (1043)
Философия (440)
Финансы (17336)
Химия (4931)
Экология (6055)
Экономика (9200)
Электроника (7621)






у него должен быть конструктор без параметров!!!!!!!!



Лекция 8. Язык XML

 

Определения

XML (англ. eXtensible Markup Language — расширяемый язык разметки; произносится [экс-эм-э́л]) — рекомендованный Консорциумом Всемирной паутины язык разметки, фактически представляющий собой свод общих синтаксических правил.

XML — текстовый формат, предназначенный для хранения структурированных данных (взамен существующих файлов баз данных), для обмена информацией между программами, а также для создания на его основе более специализированных языков разметки (например, XHTML), иногда называемых словарями.

Целью создания XML было обеспечение совместимости при передаче структурированных данных между разными системами обработки информации, особенно при передаче таких данных через Интернет.

Стандартом определены два уровня правильности документа XML.

Правильно построенный (Well-formed). Правильно построенный документ соответствует всем общим правилам синтаксиса XML, применимым к любому XML-документу. И если, например, начальный тег не имеет соответствующего ему конечного тега, то это неправильно построенный документ XML. Документ, который неправильно построен, не может считаться документом XML; XML-процессор (парсер) не должен обрабатывать его обычным образом и обязан классифицировать ситуацию как фатальная ошибка.

Действительный (Valid). Действительный документ дополнительно соответствует некоторым семантическим правилам. Это более строгая дополнительная проверка корректности документа на соответствие заранее определённым, но уже внешним правилам, в целях минимизации количества ошибок, например, структуры и состава данного, конкретного документа или семейства документов. Эти правила могут быть разработаны как самим пользователем, так и сторонними разработчиками, например, разработчиками словарей или стандартов обмена данными. Обычно такие правила хранятся в специальных файлах — схемах, где самым подробным образом описана структура документа, все допустимые названия элементов, атрибутов и многое другое. И если документ, например, содержит не определённое заранее в схемах название элемента, то XML-документ считается недействительным; проверяющий XML-процессор (валидатор) при проверке на соответствие правилам и схемам обязан (по выбору пользователя) сообщить об ошибке.

Данные два понятия не имеют достаточно устоявшегося стандартизированного перевода на русский язык, особенно понятие valid, которое можно также перевести, как имеющий силу, правомерный, надёжный, годный, или даже проверенный на соответствие правилам, стандартам, законам. Некоторые программисты применяют в обиходе устоявшуюся кальку «Валидный».



Объявление XML

XML — это описанная в текстовом формате иерархическая структура, предназначенная для хранения любых данных. Визуально структура может быть представлена как дерево элементов. Элементы XML описываются тэгами.

Рассмотрим пример простого кулинарного рецепта, размеченного с помощью XML:

 

<?xml version="1.0" encoding="UTF-8"?>

<recipe name="хлеб" preptime="5" cooktime="180">

<title>Простой хлеб</title>

<ingredient amount="3" unit="стакан">Мука</ingredient>

<ingredient amount="0.25" unit="грамм">Дрожжи</ingredient>

<ingredient amount="1.5" unit="стакан">Тёплая вода</ingredient>

<ingredient amount="1" unit="чайная ложка">Соль</ingredient>

<instructions>

<step>Смешать все ингредиенты и тщательно замесить.</step>

<step>Закрыть тканью и оставить на один час в тёплом помещении.</step>

<!-- <step>Почитать вчерашнюю газету.</step> - это сомнительный шаг... -->

<step>Замесить ещё раз, положить на противень и поставить в духовку.</step>

</instructions>

</recipe>

 

Первая строка XML-документа называется объявление XML (англ. XML declaration) — это необязательная строка, указывающая версию стандарта XML (обычно это 1.0), также здесь может быть указана кодировка символов и внешние зависимости.



 

<?xml version="1.0" encoding="UTF-8"?>

 

Спецификация требует, чтобы процессоры XML обязательно поддерживали Юникод-кодировки UTF-8 и UTF-16 (UTF-32 не обязателен). Признаются допустимыми, поддерживаются и широко используются (но не обязательны) другие кодировки, основанные на стандарте ISO/IEC 8859, также допустимы другие кодировки, например, русские Windows-1251, KOI-8. Часто в тэгах принципиально не используют не-латинские буквы, в этом случае UTF-8 является очень удобной кодировкой — объём, как правило, меньше, чем при UTF-16; декодирование может быть выполнено как для всего документа, так и для конкретных атрибутов и текстов; весь документ не содержит запрещённых символов при попытке разбора с неправильной кодировкой.

Важнейшее обязательное синтаксическое требование заключается в том, что документ имеет только один корневой элемент (англ. root element) (так же иногда называемый элемент документа (англ. document element)). Это означает, что текст или другие данные всего документа должны быть расположены между единственным начальным корневым тегом и соответствующим ему конечным тегом.

Следующий простейший пример — правильно построенный документ XML:

 

<book>Это книга: "Книжечка"</book>

 

Следующий фрагмент не может считаться корректным XML-документом:

 

<!-- ВНИМАНИЕ! Некорректный XML! -->

<thing>Сущность №1</thing>

<thing>Сущность №2</thing>

 

В любом месте дерева может быть размещен элемент-комментарий. XML-комментарии размещаются внутри специального тега, начинающегося с символов <!-- и заканчивающегося символами -->. Два знака дефис (--) внутри комментария присутствовать не могут.

 

<!-- Это комментарий. -->

 

Теги внутри комментария обрабатываться не должны.

Остальная часть этого XML-документа состоит из вложенных элементов, некоторые из которых имеют атрибуты и содержимое. Элемент обычно состоит из открывающего и закрывающего тегов, обрамляющих текст и другие элементы. Открывающий тег состоит из имени элемента в угловых скобках, например, <step>, а закрывающий тег состоит из того же имени в угловых скобках, но перед именем ещё добавляется косая черта, например, </step>. Имена элементов, как и имена атрибутов, не могут содержать пробелы, но могут быть на любом языке, поддерживаемом кодировкой XML-документа. Имя может начинаться с буквы, подчёркивания, двоеточия. Остальными символами имени могут быть те же символы, а также цифры, дефис, точка.

Содержимым элемента (англ. content) называется всё, что расположено между открывающим и закрывающим тегами, включая текст и другие (вложенные) элементы. Ниже приведён пример XML-элемента, который содержит открывающий тег, закрывающий тег и содержимое элемента:

 

<step>Замесить ещё раз, положить на противень и поставить в духовку.</step>

 

Кроме содержания у элемента могут быть атрибуты — пары имя-значение, добавляемые в открывающий тег после названия элемента. Значения атрибутов всегда заключаются в кавычки (одинарные или двойные), одно и то же имя атрибута не может встречаться дважды в одном элементе. Не рекомендуется использовать разные типы кавычек для значений атрибутов одного тега.

 

<ingredient amount="3" unit="стакан">Мука</ingredient>

 

В приведённом примере у элемента «ingredient» есть два атрибута: «amount», имеющий значение «3», и «unit», имеющий значение «стакан». С точки зрения XML-разметки, приведённые атрибуты не несут никакого смысла, а являются просто набором символов.

Кроме текста, элемент может содержать другие элементы:

 

<instructions>

<step>Смешать все ингредиенты и тщательно замесить.</step>

<step>Закрыть тканью и оставить на один час в тёплом помещении.</step>

<step>Замесить ещё раз, положить на противень и поставить в духовку.</step>

</instructions>

 

В данном случае элемент «instructions» содержит три элемента «step».

XML не допускает перекрывающихся элементов. Например, приведённый ниже фрагмент некорректен, так как элементы «em» и «strong» перекрываются.

 

<!-- ВНИМАНИЕ! Некорректный XML! -->

<p>Обычный <em>акцентированный <strong>выделенный и акцентированный</em> выделенный</strong></p>

 

Для обозначения элемента без содержания, называемого пустым элементом, необходимо применять особую форму записи, состоящую из одного тега, в котором после имени элемента ставится косая черта. Если в DTD элемент не объявлен пустым, но в документе он не имеет содержания, для него допускается применять следующие (три) формы записи. Например:

 

<foo></foo>

<foo />

<foo/>

 

Спецсимволы (кавычки, угловые скобки) в XML записываются определенным образом: как ссылка на сущность или как ссылка по номеру символа.

Сущностью (англ. entity) в XML называются именованные данные, обычно текстовые, в частности, спецсимволы. Ссылка на сущность (англ. entity references) указывается в том месте, где должна быть сущность и состоит из амперсанда (&), имени сущности и точки с запятой (;).

В XML есть несколько предопределённых сущностей, таких как lt (ссылаться на неё можно написав &lt;) для левой угловой скобки и amp (ссылка — &amp;) для амперсанда, возможно также определять собственные сущности. Помимо записи с помощью сущностей отдельных символов, их можно использовать для записи часто встречающихся текстовых блоков.

Ниже приведён пример использования предопределённой сущности для избежания использования знака амперсанда в названии:

 

<company-name>AT&amp;T</company-name>

 

Полный список предопределённых сущностей состоит из &amp; (&), &lt; (<), &gt; (>), &apos; (') и &quot; (") — последние две полезны для записи разделителей внутри значений атрибутов. Определить свои сущности можно в DTD-документе.

Ссылка по номеру символа (англ. numeric character reference) выглядит как ссылка на сущность, но вместо имени сущности указывается символ # и число (в десятичной или шестнадцатеричной записи), являющееся номером символа в кодовой таблице Юникод. Это обычно символы, которые невозможно закодировать напрямую, например, буква арабского алфавита в ASCII-кодированном документе. Амперсанд может быть представлен следующим образом:

 

<company-name>AT&#38;T</company-name>

 

Иногда бывает необходимо определить неразрывный пробел, который очень часто используется в HTML и обозначается как &nbsp;. В XML такой предопределённой сущности нет, его записывают &#160;, а использование &nbsp; вызывает ошибку. Отсутствие этой весьма распространённой сущности у множества программистов зачастую вызывает удивление и это создаёт некоторые трудности при миграции своих HTML-разработок в XML.

Достоинства

1. XML — язык разметки, позволяющий стандартизировать вид файлов-данных, используемых компьютерными программами, в виде текста, понятного человеку;

2. XML поддерживает Юникод;

3. в формате XML могут быть описаны такие структуры данных как записи, списки и деревья;

4. XML — это самодокументируемый формат, который описывает структуру и имена полей так же как и значения полей;

5. XML имеет строго определённый синтаксис и требования к анализу, что позволяет ему оставаться простым, эффективным и непротиворечивым. Одновременно с этим, разные разработчики не ограничены в выборе экспрессивных методов (например, можно моделировать данные, помещая значения в параметры тегов или в тело тегов, можно использовать различные языки и нотации для именования тегов и т. д.);

6. XML — формат, основанный на международных стандартах;

7. XML представляет собой простой текст, свободный от лицензирования и каких-либо ограничений;

8. XML не зависит от платформы;

9. XML является подмножеством SGML (который используется с 1986 года). Уже накоплен большой опыт работы с языком и созданы специализированные приложения;

10. XML не накладывает требований на порядок расположения атрибутов в элементе и вложенных элементов разных типов, что существенно облегчает выполнение требований обратной совместимости;

11. В отличие от бинарных форматов, XML содержит метаданные об именах, типах и классах описываемых объектов, по которым приложение может обработать документ неизвестной структуры (например, для динамического построения интерфейсов);

12. XML имеет реализации парсеров для всех современных языков программирования;

13. Существует стандартный механизм преобразования XSLT, реализации которого встроены в браузеры, операционные системы, веб-серверы.

14. XML поддерживается на низком аппаратном, микропрограммном и программном уровнях в современных аппаратных решениях.

Недостатки

1. Размер XML-документа существенно больше бинарного представления тех же данных. В грубых оценках величину этого фактора принимают за 1 порядок (в 10 раз).

2. Размер XML-документа существенно больше, чем документа в альтернативных текстовых форматах передачи данных (например JSON, YAML) и особенно в форматах данных, оптимизированных для конкретного случая использования.

3. Избыточность XML может повлиять на эффективность приложения. Возрастает стоимость хранения, обработки и передачи данных.

4. Неоднозначность моделирования. В результате большой гибкости языка и отсутствия строгих ограничений, одна и та же структура может быть представлена множеством способов (различными разработчиками), например, значение может быть записано как атрибут тега или как тело тега и т. д. Например: <a b="1" c="1"/> или <a b="1" c="1"></a> или <a><b>1</b><c>1</c></a> или <a><c value="1"/></a> или <a><fields b="1" c="1"/></a> и т. д.

5. XML не содержит встроенной в язык поддержки типов данных. В нём нет строгой типизации, то есть понятий «целых чисел», «строк», «дат», «булевых значений» и т. д.

6. Иерархическая модель данных, предлагаемая XML, ограничена по сравнению с реляционной моделью и объектно-ориентированными графами и сетевой моделью данных.

7. Пространства имён XML сложно использовать и их сложно реализовывать в XML-парсерах.

 

Отображение XML во Всемирной паутине

Наиболее распространены три способа преобразования XML-документа в отображаемый пользователю вид:

· Применение стилей CSS;

· Применение преобразования XSLT;

· Написание на каком-либо языке программирования обработчика XML-документа.

Документация XML в C#

XML комментарии, обозначаемые тройным слэшем (///), являются формой XML, используемой для документирования. Теги, используемые в комментариях, полностью настраиваемые; однако есть ряд тегов, которые согласованы с ECMA. Рекомендуемые теги имеют определенные значения для C# компилятора и Visual Studio IDE, но разработчики могут расширять этот рекомендуемый набор, чтобы проводить в жизнь корпоративные стандарты ведения документации, обеспечивать команды разработчиков совместимыми вариантами форматирования или добавлять любую дополнительную, по их мнению, необходимую информацию. Единственным ограничением в XML комментариях является то, что XML, размещенный в тегах, должен быть правильно построен. Это требование выдвигается C# компилятором, как частью процесса компиляции.

C# разработчики могут использовать XML комментарии, чтобы документировать код определенных пользователем типов, включая классы, делегаты, перечисления и структуры. Кроме того, XML комментарии могут быть применены к членам, включая поля, события, свойства, индексаторы и методы

Visual Studio .NET автоматически распознает и использует рекомендуемый набор тегов для создания собственной IntelliSense документации. Три наиболее важных рекомендуемых тега: <param>, <summary> и <remarks>. Теги <param> и <summary> используются в Intellisense, в то время как все три тега используются в VS ObjectBrowser.

 

Сериализация и десериализация объекта в XML

Сериализация — процесс перевода какой-либо структуры данных в последовательность битов. Обратной к операции сериализации является операция десериализации — восстановление начального состояния структуры данных из битовой последовательности.

Сериализация используется для передачи объектов по сети и для сохранения их в файлы. Например, нужно создать распределённое приложение, разные части которого должны обмениваться данными со сложной структурой. В таком случае для типов данных, которые предполагается передавать, пишется код, который осуществляет сериализацию и десериализацию. Объект заполняется нужными данными, затем вызывается код сериализации, в результате получается, например, XML-документ. Результат сериализации передаётся принимающей стороне, например, по электронной почте или HTTP. Приложение-получатель создаёт объект того же типа и вызывает код десериализации, в результате получая объект с теми же данными, что были в объекте приложения-отправителя.

Рассмотрим решение задачи сериализации и десериализации с помощью XML. Автоматическая сериализация объектов— простейший способ преобразования двоичных объектов в XML и обратно. Однако здесь необходимо сделать очень важное предупреждение: этот способ работает только с открытыми типами и открытыми членами этих типов. Помня об этом, рассмотрим код, включающий в себя класс:

 

public class Person

{

public string FirstName { get; set; }

public DateTime BirthDate { get; set; }

// !!!!!Чтобы тип можно было сериализовать в XML,

у него должен быть конструктор без параметров!!!!!!!!

public Person () { }

public Person (string firstName, DateTime birthDate)

{

this .FirstName = firstName;

this.BirthDate = birthDate;

}

}

 

Этот код не имеет никакого отношения к XML. Он лишь содержит объекты данных, которые мы и будем сохранять. Чтобы сериализовать (а затем десериализовать) объекты, сделаем следующее. Во-первых, подключим нужные namespase и создадим объект, который будем сериализовывать:

 

using System.Xml;

using System.Xml.Serialization;

using System.IO;

 

Person person = new Person("John", new DateTime(177 6, 7, 4));

 

Затем, создадим объект класса XmlSerializer, настроенного на наш класс:

 

XmlSerializer serializer = new XmlSerializer (typeof (Person) ) ;

 

Откроем файл для записи сериализуемого объекта:

 

FileStream f = new FileStream("C:\\fakepath\\2.xml", FileMode.OpenOrCreate);

 

Выполним сериализацию в файл:

 

using (StreamWriter sw = new StreamWriter (f) )

{

serializer.Serialize(sw, person);

}

 

Затем откроем файл для чтения и выполним десериализацию:

 

FileStream f2 = new FileStream("C:\\fakepath\\2.xml", FileMode.Open);

 

using (StreamReader sr = new StreamReader(f2))

{

Person newPerson = serializer.Deserialize(sr) as Person;

}

 

XML-файл будет иметь примерно следующий вид:

 

<?xml version="1.0" encoding="utf-16"?>

<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:xsd="http:/www.w3 . org/2001/XMLSchema">

< FirstName> John< / FirstName>

<BirthDate>1776-07-04T00:00:00</BirthDate>

</Person>

 

Управление сериализацией объекта

Иногда при сериалдизации необходимо игнорировать некоторые свойства класса, изменить имена элементов или проводить различие между элементами и атрибутами. Работа с классом xmiserializer в значительной степени автоматизирована, но существуют простые и удобные способы модифицировать результирующий XML-код в соответствии со своими потребностями. Предположим в качестве примера, что вы снабдили класс Person следующими свойствами и их атрибутами:

 

[XmlIgnore]

public char Middlelnitial { get; set; }

[XmlElement(”DOB") ]

public DateTime BirthDate { get; set; }

[XmlAttribute ("GPA") ]

public double HighschoolGPA { get; set; }

 

Вы получите такой вывод в XML:

 

<?xml version="1.0" encoding="utf-16"?>

<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:xsd="http://

www.w3.org/2001/XMLSchema" GPA="3.5">

<Firs tName>John</FirstName>

<LastName>Public</LastName>

<DOB>1776-07-04T00:00:00</DOB>

</Person>

Создание XML-документа «с нуля»

При создании собственного XML-кода в вашем распоряжении имеются, два способа:

□ записать каждый элемент и атрибут по порядку, от начала и до конца;

□ построить объектную модель документа (DOM).

 

У каждого способа есть свои плюсы и минусы. В основном, вам приходится выбирать между скоростью работы и эффективностью использования ресурсов. Построение модели DOM в памяти позволяет легко обращаться ко всем узлам, но такой подход занимает много ресурсов и работает медленно. Простой вывод всех элементов происходит быстро, но требует больше усилий при сложных моделях данных. Примеры обоих подходов приводятся ниже.

 

Построение XML-документа с помощью класса XmlDocument

 

Класс xmlDocument представляет в памяти компьютера структуру XML-узла. Пример генерации XML-документа с выводом его в файл:

 

XmlDocument doc = new XmlDocument () ;

XmlElement bookElem = doc.CreateElement("Book");

bookElem.SetAttribute("PublishYear","2009");

XmlElement titleElem = doc.CreateElement("Title");

titleElem.InnerText = "Programming, art or engineering?";

XmlElement authorElem = doc.CreateElement("Author");

authorElem.InnerText = "Billy Bob";

bookElem.AppendChild( titleElem) ;

bookElem.AppendChild(authorElem);

doc.AppendChild (bookElem) ;

FileStream f2 = new FileStream("C:\\fakepath\\2.xml", FileMode.OpenOrCreate);

// Можно с тем же успехом выводить в файл или любой другой поток //данных

using (StreamWriter sw = new StreamWriter(f2))

using (XmlTextWriter xtw = new XmlTextWriter(sw))

{

// Если это не указать, XML-код будет представлять собой

// длинную строчку символов; это подходит для передачи

//по сети, но не для вывода

xtw.Formatting = Formatting.Indented;

doc.WriteContentTo(xtw);

}

f2.Close();

 

Построение XML-документа с помощью класса XmlTextWriter.

 

FileStream f2 = new FileStream("C:\\fakepath\\3.xml", FileMode.OpenOrCreate);

// Можно с тем же успехом выводить в файл или любой другой поток //данных

using (StreamWriter sw = new StreamWriter(f2))

using (XmlTextWriter xtw = new XmlTextWriter(sw))

{

xtw.Formatting = Formatting.Indented;

xtw.WriteStartElement("Book");

xtw.WriteAttributeString("PublishYear", "2009") ;

xtw.WriteStartElement("Title");

xtw.WriteString("Programming, art or engineering?");

xtw.WriteEndElement();

xtw.WriteStartElement("Author");

xtw.WriteString("Billy Bob");

xtw.WriteEndElement() ;

xtw.WriteEndElement();

}

 

f2.Close();

Чтение XML-файла

Необходимость делать выбор между двумя крайностями, стоящая перед вами при генерировании XML-файла, проявляется еще ярче, когда вы читаете его. Если XML-файл большой и сложный, класс xmlDocument сильно замедлит работу. Класс XmlTextReader работает быстро, но перекладывает на вас обязанность отслеживать состояние. Выбор между двумя способами чтения вы должны сделать самостоятельно.

 

Чтение XML-файла с помощью класса XmiDocument

Способ применяется, если вам нужно прочитать XML-документ, и при этом либо объем документа не очень велик, либо вопросы производительности вас не волнуют. Класс xmlDocument содержит методы для загрузки XML-документов из файлов, потоков или строк.

 

class Program

{

const string sourceXml =

"<Book PublishYear=\"2009\">"+

"<Title>Programming, art or engineering?</Title>"+

"<Author>Billy Bob</Author>"+

"</Book>";

static void Main(string[] args)

{

XmlDocument doc = new XmlDocument();

doc.LoadXml(sourceXml);

Console.WriteLine("Publish Year: {0}",

doc.GetElementsByTagName("Book")[0].Attributes["PublishYear"].Value);

Console.WriteLine("Author: {0}",

doc.GetElementsByTagName("Author")[0].InnerText);

}

}

 

Чтение XML-файла с помощью класса XmlTextReader

Применяется если вам нужно прочитать XML-документ, причем производительность программы имеет большое значение, объект-документ вам не нужен, а объектную структуру документа вы можете создавать самостоятельно. Воспользуйтесь классом XmlTextReader, способным читать информацию из самых разных источников. В нашем примере, поскольку XML-код находится в строке, вам еще понадобится класс stringReader, который преобразует ее в ПОТОК данных для класса XmlTextReader.

 

class Program

{

const string sourceXml =

"<Book PublishYear=\"2009\">" +

"<Title>Programming/ art or engineering?</Title>" +

"<Author>Billy Bob</Author>" +

"</Book>";

static void Main(string[] args)

{

string publishYear = null, author = null;

using (StringReader reader = new StringReader(sourceXml))

using (XmlTextReader xmlReader = new XmlTextReader(reader))

{

while (xmlReader.Read())

{

if (xmlReader.NodeType == XmlNodeType.Element)

{

i f (xmlReader.Name = = "Book")

{

if (xmlReader.MoveToAttribute("PublishYear"))

{

publishYear = xmlReader.Value;

}

}.

else if (xmlReader.Name == "Author")

{

xmlReader.Read();

author = xmlReader.Value;

}

}

}

}

Console.WriteLine("Publish Year: {0}", publishYear);

Console.WriteLine("Author: {0}", author);

}

}

 

Вы видите, насколько объемнее получился код в этом случае.


Эта страница нарушает авторские права

allrefrs.ru - 2018 год. Все права принадлежат их авторам!