Занятие №4 на курса по информационни технологии (2013) провеждан от ДАВИД академия в ПМГ "Никола Обрешков" - Казанлък. Включва темите:
- XML
- XSD
- XML в .NET Framework
3. XML
• Какво е „XML“?
– eXtensible Markup Language
– Формален език за съхранение на структурирани
данни
– Сходен с HTML
– Препоръчан от W3C през 1998 г.
4. XML
• Възли (nodes)
–
–
–
–
–
–
–
–
–
Основна структурна единица на XML документ
Организирани в дървовидна структура
Елементи
Атрибути
Текст
CDATA
Коментари
Entity references
Други...
5. XML
• Елементи
– Име
•
•
•
•
•
Поредица от символи
Не съдържа интервали
Не започва с цифра или препинателен знак
Не започва с поредицата xml
Прави се разлика между малки и главни букви
– Отварящ и затварящ таг – заградени в ъглови скоби
– Кратък запис с един таг – може да съдържа
единствено атрибути
– Коренов елемент – единствен
7. XML
• Атрибути
– Име – важат правилата за именоване на елементи;
уникално измежду всички атрибути на елемента
– Включват се в отварящия таг на елемента
– Съдържание – текст или референция към обект
– Съдържанието се поставя в кавички
8. XML
• Атрибути
<library>
<books>
<book author="J. R. R. Tolkien" year="1954">
<title>The Fellowship of the Ring</title>
</book>
<book author="J. K. Rowling" year="1997">
<title>Harry Potter and the Philosopher's Stone</title>
</book>
</books>
<newspapers blackAndWhite="true" />
</library>
9. XML
• Коментари
– Заграждат се между поредиците от символи <!-- и
-->
– Не се обработват от приложенията, които четат XML
документа
<library>
<books>
<!-- Good book! -->
<book author="J. R. R. Tolkien" year="1954">
<title>The Fellowship of the Ring</title>
</book>
<!-<book author="J. K. Rowling" year="1997">
<title>Harry Potter and the Philosopher's Stone</title>
</book>
-->
</books>
</library>
10. XML
• Представяне на неразрешени символи
– Използват се entity references: поредици от символи,
започващи с & и завършващи с ;
– < замества символа <
– > замества символа >
– & замества символа &
– " замества символа "
– Екзотични Unicode символи могат да се запишат чрез
&#nnnn; или &#xhhhh;, където nnnn е десетичен запис
на кода на символа, а hhhh е шестнадесетичен запис
на кода му
11. XML
• CDATA възли
– Служат за описване на текст, който съдържа много
неразрешени символи, така че да не се налага те да се
заместват с entity references навсякъде
– Текстът се загражда между поредиците от символи
<![CDATA[ и ]]>
<codeSamples>
<codeSample>
<![CDATA[
public void FilterNumbers(int[] numbers)
{
return numbers.Where(n => n > 0 && n < 1000);
}
]]>
</codeSample>
</codeSamples>
12. XML
• XML декларация
– Поставя се в началото на XML документа, преди
кореновия елемент
– Указва версията на XML спецификацията, описваща
формата на документа; кодирането на символите в
документа (UTF-8, ANSI code page 1251 и т.н.) както и
това дали документът е независим от външни
източници
<?xml version="1.0" encoding="utf-8" ?>
13. XML
• Пространства от имена
– Произволни низове
– Служат за различаване на елементи или атрибути със
съвпадащи имена (подобно на пространствата от
имена в .NET)
– Указват се в рамките на елемент с помощта на
служебни атрибути xmlns или xmlns:prefix, където
prefix е произволна поредица от символи,
отговаряща на изискванията за валидно име на
елемент
– Указаните пространства от имена са валидни в цялото
поддърво от елементи на текущия елемент
14. XML
• Пространства от имена
– Пространството от имена по подразбиране се
определя от xmlns атрибута
– Префиксите се поставят преди името на
елемента/атрибута, следвани от двоеточие
<library xmlns="http://david.bg/xml/library"
xmlns:p="http://david.bg/xml/persons">
<books>
<book author="J. R. R. Tolkien" year="1954">
<title>The Fellowship of the Ring</title>
<checkedOutBy>
<p:person firstName="Alexander" lastName="Dalemski" />
</checkedOutBy>
</book>
</books>
</library>
15. XML Schema Definition
• Какво е „XML Schema Definition“?
– Вид XML документ
– Служи за формално описване на структурата на други
XML документи
– Налага ограничения върху допустимите възли в
документа
– Използва се за валидиране на XML документи
– XSD файлове
16. XML Schema Definition
• Основни характеристики и компоненти на XML
схема
–
–
–
–
Целево пространство от имена
Декларации на типове данни (прости и сложни)
Декларации на елементи
Декларации на атрибути
17. XML Schema Definition
• Целево пространство от имена
– Указва пространството от имена по подразбиране,
чиито елементи/атрибути се описват от схемата
– Обикновено всички елементи и атрибути, описвани в
схемата, принадлежат на едно и също пространство
от имена
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://david.bg/xml/library">
</xs:schema>
18. XML Schema Definition
• Прости типове данни
– Вградени типове данни
– Потребителски дефинирани прости типове данни
• Изброени типове
• Типове, получени чрез ограничаване на дефиниционното
множество на друг тип данни
• Типове, получени чрез обединение на дефиниционните
множества на други типове данни
<xs:simpleType name="bgdate">
<xs:restriction base="xs:string">
<xs:pattern value="d{2}.d{2}.d{4}" />
</xs:restriction>
</xs:simpleType>
19. XML Schema Definition
• Сложни типове данни
– Описват групи от елементи
– Може да се посочи поредност
– Може да се укажат минимален и максимален брой
повторения
<xs:complexType name="book">
<xs:sequence>
<xs:element name="title" type="xs:string" />
<xs:element name="genre" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
20. XML Schema Definition
• Декларации на елементи
– Описват съдържанието на елементите на съответното
място в дървото на XML документа, които имат
съответното име
<xs:element name="book">
<xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string" />
<xs:element name="genre" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
21. XML Schema Definition
• Декларации на атрибути
– Описват типа на данните, които се съхраняват в
съответните атрибути, както и дали са задължителни
<xs:element name="book">
<xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string" />
<xs:element name="genre" type="xs:string" minOccurs="0" />
</xs:sequence>
<xs:attribute name="author" type="xs:string" />
<xs:attribute name="year" type="xs:int" use="optional" />
</xs:complexType>
</xs:element>
22. XML Schema Definition
• Обвързване на XML документ със схема
– Осъществява се чрез атрибута schemaLocation от
пространството от имена
http://www.w3.org/2001/XMLSchema-instance
<library xmlns="http://david.bg/xml/library"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://david.bg/xml/library
http://david.bg/schemas/library.xsd">
<books>
<book author="J. R. R. Tolkien" year="1954">
<title>The Fellowship of the Ring</title>
</book>
</books>
</library>
23. XML Schema Definition
• Валидиране на XML документ
– Документът се валидира спрямо схемата (или
схемите), с която е обвързан
– Visual Studio
– Външни инструменти
– При прочитане на документа в .NET Framework
24. Приложения на XML
• Какви са приложенията на XML?
–
–
–
–
Съхранение на данни
Интеграция на софтуерни системи
Уеб услуги
Езици, специфични за предметната област (domainspecific languages, DSL)
25. Приложения на XML
• Съхранение на данни
–
–
–
–
Данните се сериализират в XML документ
Структурираност и еднозначност
Възможност за валидация
Заема повече място от двоично сериализирани данни
26. Приложения на XML
• Интеграция на софтуерни системи
– Различните системи боравят с различно форматирани
данни
– Универсален формат за данните, базиран на XML
– Трансформация от вътрешното представяне на
данните в системата към универсалния формат и
обратно
27. Приложения на XML
• Уеб услуги
– Универсален, строго дефиниран стандарт
– Възможност за предаване през HTTP
– Библиотеки за работа с XML документи във всякакви
операционни системи/платформи
– Разширяемост на структурата на данните
28. Приложения на XML
• Езици, специфични за предметната област
–
–
–
–
–
XSD
XSLT
XAML
DBML
XHTML
29. XmlDocument
• Класът System.Xml.XmlDocument
– Дефиниран в асемблито System.Xml
– Служи за зареждане на XML документ в паметта и
манипулации с възлите му
– Може да се използва за създаване на XML документи
и записването им във файлове
– Методът Load(…)
– Методът Save(…)
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(@"C:test.xml");
xmlDocument.Save(@"C:test2.xml");
30. XmlDocument
• Създаване на XML документи
XmlDocument xmlDocument = new XmlDocument();
XmlDeclaration xmlDeclaration =
xmlDocument.CreateXmlDeclaration("1.0", "utf-8", "yes");
xmlDocument.AppendChild(xmlDeclaration);
XmlElement libraryElement = xmlDocument.CreateElement("library");
xmlDocument.AppendChild(libraryElement);
XmlElement booksElement = xmlDocument.CreateElement("books");
libraryElement.AppendChild(booksElement);
XmlElement bookElement = xmlDocument.CreateElement("book");
booksElement.AppendChild(bookElement);
XmlAttribute authorAttribute = xmlDocument.CreateAttribute("author");
authorAttribute.Value = "J. R. R. Tolkien";
bookElement.Attributes.Append(authorAttribute);
XmlElement titleElement = xmlDocument.CreateElement("title");
XmlText titleText = xmlDocument.CreateTextNode("The Two Towers");
titleElement.AppendChild(titleText);
bookElement.AppendChild(titleElement);
xmlDocument.Save(@"C:library.xml");
31. XmlDocument
• Прочитане на XML документи
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(@"C:library.xml");
XmlElement libraryElement = xmlDocument["library"];
XmlElement booksElement = libraryElement["books"];
XmlNodeList bookElements = booksElement.GetElementsByTagName("book");
foreach (XmlElement bookElement in bookElements)
{
XmlAttribute authorAttribute = bookElement.Attributes["author"];
XmlElement titleElement = bookElement["title"];
Console.WriteLine("Title: {0}; Author: {1}",
titleElement.InnerText, authorAttribute.Value);
}
Console.ReadLine();
32. LINQ to XML
• Какво е „LINQ to XML“?
– Част от .NET Framework
– Имплементация на LINQ
– Допълнителни разширителни методи за работа с
колекции от XML възли
– Улеснява боравенето с XML документи
– Асемблито System.Xml.Linq
– Пространството от имена System.Xml.Linq
33. LINQ to XML
• Създаване на XML документи
XDocument xmlDocument = new XDocument();
xmlDocument.Declaration = new XDeclaration("1.0", "utf-8", "yes");
XElement libraryElement = new XElement("library");
xmlDocument.Add(libraryElement);
XElement booksElement = new XElement("books");
libraryElement.Add(booksElement);
XElement bookElement = new XElement("book");
booksElement.Add(bookElement);
XAttribute authorAttribute = new XAttribute("author", "J. R. R. Tolkien");
XElement titleElement = new XElement("title", "The Two Towers");
bookElement.Add(authorAttribute, titleElement);
xmlDocument.Save(@"C:library.xml");
34. LINQ to XML
• Създаване на XML документи
XAttribute authorAttribute = new XAttribute("author", "J. R. R. Tolkien");
XElement titleElement = new XElement("title", "The Two Towers");
XElement bookElement = new XElement("book", authorAttribute, titleElement);
XElement booksElement = new XElement("books", bookElement);
XElement libraryElement = new XElement("library", booksElement);
XDeclaration xmlDeclaration = new XDeclaration("1.0", "utf-8", "yes");
XDocument xmlDocument = new XDocument(xmlDeclaration, libraryElement);
xmlDocument.Save(@"C:library.xml");
35. LINQ to XML
• Прочитане на XML документи
XDocument xmlDocument = XDocument.Load(@"C:library2.xml");
var books =
from e in xmlDocument.Element("library").Element("books")
.Elements("book")
where e.Attribute("author") != null
select new
{
Title = e.Element("title").Value,
Author = e.Attribute("author").Value,
};
foreach (var book in books)
{
Console.WriteLine("Title: {0}; Author: {1}", book.Title, book.Author);
}
36. Сериализиране на обекти към XML
• Сериализиране към XML
– Вградена поддръжка в .NET Framework
– Пространството от имена System.Xml.Serialization
в асемблито System.Xml
– Сериализират се единствено публичните свойства на
обекта
– Атрибути за управление сериализирането на класове
и свойства
– Класът XmlSerializer
37. Сериализиране на обекти към XML
• Сериализиране по подразбиране
– По подразбиране всички свойства се сериализират
като елементи
– Името на елементите по подразбиране съвпада с
името на свойството
– Ако се сериализира колекция от елементи, по
подразбиране се създава един елемент с името на
колекцията и в него се поставят по един елемент за
всеки от обектите в колекцията; имената на
вътрепните елементи се определят от името на типа
на обектите
38. Сериализиране на обекти към XML
• Управление на сериализирането
–
–
–
–
–
Атрибутът XmlRoot
Атрибутът XmlElement
Атрибутът XmlAttribute
Атрибутът XmlArray
Атрибутът XmlArrayItem
39. Сериализиране на обекти към XML
• Управление на сериализирането
[XmlRoot("library")]
public class Library
{
[XmlArray("books")]
[XmlArrayItem("book")]
public List<Book> Books { get; set; }
}
public class Book
{
[XmlAttribute("author")]
public string Author { get; set; }
[XmlElement("title")]
public string Title { get; set; }
}
40. Сериализиране на обекти към XML
• Класът XmlSerializer
– В конструктора му се подава тип, който ще бъде
сериализиран или десериализиран
– Методът Serialize(…)
– Методът Deserialize(…)
41. Сериализиране на обекти към XML
• Сериализиране на обект към XML
var book = new Book
{
Author = "J. R. R. Tolkien",
Title = "The Two Towers",
};
var library = new Library
{
Books = new List<Book> { book },
};
var xmlSerializer = new XmlSerializer(typeof(Library));
using (FileStream stream = File.Create(@"C:library.xml"))
{
xmlSerializer.Serialize(stream, library);
}
42. Сериализиране на обекти към XML
• Десериализиране на обект от XML
Library library;
var xmlSerializer = new XmlSerializer(typeof(Library));
using (FileStream stream = File.OpenRead(@"C:library.xml"))
{
library = (Library)xmlSerializer.Deserialize(stream);
}
foreach (Book book in library.Books)
{
Console.WriteLine("Title: {0}; Author: {1}", book.Title, book.Author);
}