Это только небольшая часть того, что можно делать с помощью XSL.
Программная обработка XML в C#
Для обработки текста XML заранее известного формата совсем не сложно написать собственный обработчик (parser). Однако существуют стандартные средства работы с XML.
Способы работы с XML можно разделить на две больших группы:
1) Объектные модели документа
В этих обработчиках документ загружается в память в виде набора объектов, с помощью методов котоырх можно получать доступ к данным в XML-документе. Самой известной из таких моделей является DOM (Document Object Model), в которой XML-документ представляется в виде дерева.
Объектные модели удобны, когда нужно обеспечивать произвольный доступ к узлам в XML-документе, использовать сложные фильтры, создавать новые XML-документы в памяти.
2) Синтаксические анализаторы, последовательно обрабатывающие документы
Обработчики этой группы последовательно обходят тэги XML-текста, считывают данные и выполняют необходимые действия. Для такой обработки XML-файлов существует стандарт SAX (Simple API for XML).
Такой способ обработки документов удобен для извлечения неболших фрагментов информации из документа, при обработке больших документов (поскольку не нужно полностью загружать документ в память) и когда нужно иметь возможность остановить обработки документа в случае ошибки.
В C# классы для работы с XML находятся в пространстве имен System.Xml
Последовательное чтение Xml файла удобно производить с помощью XmlTextReader. Рассмотрим пример чтения и записи файла этими способами.
public class XPriceListItem
{
string _category;
public string Category
{
get { return _category; }
set { _category = value; }
}
string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
decimal _price;
public decimal Price
{
get { return _price; }
set { _price = value; }
}
public XPriceListItem(XmlReader r)
{
if (r.LocalName == "Item")
{
_category = r.GetAttribute("Category");
// Читаем открывающий тэг Item
r.ReadStartElement();
// Читаем название товара как строку
_name = r.ReadElementString();
// А цену, как число
_price = r.ReadElementContentAsDecimal();
// Читаем закрывающий тэг Item
r.ReadEndElement();
}
}
public void Save(XmlWriter w)
{
w.WriteStartElement("Item");
w.WriteAttributeString("Category", _category);
w.WriteElementString("Product", _name);
// Используем InvariantInfo, чтобы разделитель был всегда точка
// Сохранить xmlDoc можно просто вызывав метод xmlDoc
// Открываем получившийся файл
Process.Start("price2.xml");
}
}
XPath
XPath используется для обращения к элементам внутри XML-документа. Выражения XPath используются в других технологиях XML для обращения к узлам (например, при указании уникальных значений в XSD). В C# с помощью xpath можно получать набор узлов из XML документа.
// Получаем все дочерние узлы для узла PriceList (все тэги Item)
Схемы XSD (XML Schema Definition) определяют ограничения на формат XML файла. Сама схема XSD также является xml-файлом специального формата. XSD описывают структуру документа, а также другие ограничения – уникальность полей, типы данных используемые в значениях и т.д. Для примера с прайсом XSD схема будет выглядеть так:
<!-- Поле Product во всех позициях прайса должно быть уникальным
для указания элементов используется XPath-->
<xs:unique name="ItemUnique">
<xs:selector xpath="mstns:Item" />
<xs:field xpath="mstns:Product" />
</xs:unique>
</xs:element>
</xs:schema>
Чтобы связать документ со схемой, в корневом тэге XML-документа нужно указать пространство имен.
<PriceList xmlns="urn:price-schema">
Такой атрибут тэга означает, что будет использоваться пространство имен urn:price-schema. Вообще, пространства имен используются, чтобы обеспечить уникальность тэгов с помощью префиксов.
Для того, чтобы проверить документ на соответствие схеме, в C# используется проверяющий (validating) reader.
// Создаем обычный reader
XmlTextReader r = new XmlTextReader(@"price.xml");
// Игнорируем пробелы и символы табуляции
r.WhitespaceHandling = WhitespaceHandling.None;
try
{
// Создаем проверяющий reader
XmlValidatingReader v = new XmlValidatingReader(r);
Для загрузки документа в виде объектной модели, также используется проверяющий reader. На этом примере также будет продемонстрирован альтернативный способ проверки ошибок соответствия схеме – через обработчик событий.
public void ValidationError(object Sender, ValidationEventArgs e)
Компилятор – это программа, которая считывает текст программы, написанный на одном языке – исходном, и транслирует (переводит) его в эквивалентный текст на другом языке – целевом.
Компилятор
Исходная программа
Сообщения об ошибках
Целевая
программа
Компиляция состоит из двух частей: анализа и синтеза. Анализ – это разбиение исходной программы на составные части и создание ее промежуточного представления. Синтез – конструирование требуемой целевой программы из промежуточного представления.
Многие программные инструменты, работающие с исходными программами, сначала выполняют определенный вид анализа. Рассмотрим примеры таких инструментов.