LINQ для XSD

•    Скачать демонстрационный проект - 109.29 KB

Введение

Данная статья объясняет, как использовать Linq с XML с использованием файла XSD.

Цель использования Linq для XSD - улучшить Linq для XML путем добавления дополнительных возможностей, полей со строгим контролем типов.

Данная статья дает метод использования базы данных XML с помощью новой технологии Linq для XSD.
Она не перечисляет все варианты, все типы ошибок, но дает читателю нужные знания для начала работы.

Подготовка

Прежде чем читать эту статью, вы должны знать основы LINQ, XML и XSD. Вам стоит изучить следующее, если вы еще не знакомы с упомянутыми технологиями:
•    LINQ для SQL для новичков
•    Учебник по XSD
•    Учебник по XSD- w3schools
•    Введение в XML
•    Учебник по XML - w3schools
•    LINQ для XML

Очередной LINQ для чего-то

Эта технология может применяться для управления базой данных XML.

Я начал искать информацию о LINQ для XML, чтобы обрабатывать запросы, отличные от базы данных XML. Но мне не нравился синтаксис запросов из-за неясности и отсутствия строгого контроля типов. Код получался нечитабельным и малопонятным для новичков. Я искал нечто очень простое и легкое в использовании.

Я хотел бы писать простейший код и управлять данными играючи! LINQ для XSD справляется с этим.

Предпосылки и предупреждения

Перед созданием нового проекта вам надо установить обновление LINQ для XSD alpha 2 на компьютер. Это альфа-версия программного продукта, поэтому устанавливайте ее аккуратно.

База данных

Чтобы использовать Linq для XSD, вы должны иметь файл XSD, описывающий и проверяющий правильность вашей схемы базы данных XML.

В сжатом файле примера вы найдете каталог Database, содержащий базу данных XML со связанным с ней файлом схемы XSD.

Файл XSD

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="urn:books"
            xmlns:bks="urn:books">

  <xsd:element name="books" type="bks:BooksForm"/>

  <xsd:complexType name="BooksForm">
    <xsd:sequence>
      <xsd:element name="book"
                  type="bks:BookForm"
                  minOccurs="0"
                  maxOccurs="unbounded"/>
      </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="BookForm">
    <xsd:sequence>
      <xsd:element name="author"   type="xsd:string"/>
      <xsd:element name="title"    type="xsd:string"/>
      <xsd:element name="genre"    type="xsd:string"/>
      <xsd:element name="price"    type="xsd:float" />
      <xsd:element name="pub_date" type="xsd:date" />
      <xsd:element name="review"   type="xsd:string"/>
    </xsd:sequence>
    <xsd:attribute name="id"   type="xsd:string"/>
  </xsd:complexType>
</xsd:schema>
Файл базы данных XML
 
<?xml version="1.0"?>
<x:books xmlns:x="urn:books">
   <book id="bk001">
      <author>Роберт Ирвин Говард</author>
      <title>Пришествие Конана-Киммерийца</title>
      <genre>Научная фантастика и фэнтези</genre>
      <price>44.95</price>
      <pub_date>2003-12-02</pub_date>
      <review>Конан разошелся, харкая кровью изо рта..</review>
   </book>

   <book id="bk002">
      <author>Терри Гудкайнд</author>
      <title>Первое правило волшебника</title>
      <genre>Фэнтези</genre>
      <price>24.95</price>
      <pub_date>2001-06-23</pub_date>
      <review>Лучшая книга в мире</review>
   </book>

   <book id="bk003">
      <author>Г.Ф. Лавкрафт</author>
      <title>Зов Ктулху</title>
      <genre>Научная фантастика и фэнтези</genre>
      <price>42</price>
      <review>Я пишу это под значительным психическим напряжением,
        так как к вечеру я должен умереть...</review>
   </book>
</x:books>

Создание нового проекта

Установив Linq для XSD, откройте Visual Studio 2008 и создайте новый проект Linq для XSD.

Затем добавьте файл XSD в проект (создайте новый файл или импортируйте уже имеющийся).

Наконец, измените настройки сборки для файла XSD. Откройте свойства файла XSD из Проводника решения и смените действие Сборки на LinqToXSDSchema.

Соберите ваш проект, и затем вы готовы использовать Linq для другого файла XML.

Открытие базы данных XML

Примечание: Если вы задали пространство имен в файле XSD, то это же пространство имен доступно из C# со всеми включенными классами!

В файлах XSD/XML примера используется пространство имен urn::books::.

  свернуть

urn.books.books m_books_database = urn.books.books.Load("books.xml");

Запросы

Можно непосредственно использовать объект m_books_database внутри запросов LINQ:

//извлечь список книг
var list_books = from c in m_books_database.book
                 select c;

Теперь list_books содержит полный список книг из вашего файла XML. Поэтому вы можете управлять данными путем использования foreach или их отправки управляющему элементу databindable.

Другой запрос с конкретным значением вывода (Title (Author) : Price):

var list_books_title =     from c in m_books_database.book
            select c.title + " (" + c.author + ") Price:" +
            c.price.ToString() + "$";
listBox1.DataSource = list_books_title.ToList();

Изменение данных XML

Чтобы изменить атрибут XML с помощью Linq, надо запросить любой объект, изменить его свойства и в конце сохранить базу данных.

//запросить книгу, обозначенную bk001
var book001 = from c in m_books_database.book
          where c.id.CompareTo("bk001")==0
          select c;

//помнить, что book001 является IEnumarable, поэтому надо проверить наличие первого элемента
book001.First().price = 1234;

//сохранить базу данных (здесь сохраняется в новый файл, чтобы увидеть различия между файлами)
m_books_database.Save("books2.xml");

Удаление и создание элементов

Удаление книги

Чтобы удалить элемент XML, запросите объект и вызовите метод Remove (удалить) экземпляра базы данных.

//выбрать книгу bk001
var book001 = from c in m_books_database.book
          where c.id.CompareTo("bk001")==0
          select c;

//удалить ее
foreach (var b in book001)
    m_books_database.book.Remove(b);

Создание новой книги

Чтобы создать новый элемент XML, создайте локальный объект и добавьте этот элемент в экземпляр базы данных.

//создать экземпляр книги
urn.books.BookForm itemToAdd = new urn.books.BookForm();
itemToAdd.author = "Andrew Troelsen";
itemToAdd.genre="Programming";
itemToAdd.id="bk004";
itemToAdd.price=37.79f;
itemToAdd.pub_date=Convert.ToDateTime("2007-12-07");
itemToAdd.title = "Pro C# 2008 and the .NET 3.5 Platform";

//добавить его в базу данных
m_books_database.book.Add(itemToAdd);
Строгий контроль типов и Intellisense

Одной из основных выгод Linq для XSD (по сравнению с Linq для XML) является то, что объекты имеют строгий контроль типов и могут непосредственно использоваться intellisense (системы автодополнения).

Он позволяет повысить продуктивность и предотвратить ошибки времени выполнения. (Сборка обнаруживает ошибки, так как объекты действительно относятся к определенному типу).

Преимущества
•    Легкость использования
•    Нужно меньше кода, поэтому меньше число ошибок
•    Быстрая реализация
•    Лучше, чем Linq для XML
•    Полностью объединен с intellisense
•    Читабельный код