Собрать данные из XML файлов в Excel и экспортировать. Как открыть XML файл в Excel

Цель работы: получить практические навыки обработки данных, представленных в формате Extensible Markup Language (XML ).

Задачи работы:

– изучить технологию описания данных XML ;

– изучить основные классы библиотеки FCL , поддерживающие обработку данных, представленных в формате XM L;

– выполнить практическое задание по разработке приложения на языке С#.

Краткие теоретические сведения

Формат XML – это способ хранения данных, представленных в простом текстовом формате, что означает, что эти данные могут быть прочитаны практически любым компьютером. Данное обстоятельство делает этот формат весьма подходящим для использования при передаче данных через Интернет и допускает даже непосредственное прочтение человеком.

XML является языком разметки, с помощью которого можно описать произвольные данные. На основеэтогоязыка можно организовать хранение информации и ее обмен, не зависящий ни от конкретных приложений, ни от платформы, на которой они исполняются.

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

Microsoft . NET Framework использует объектную модель данных XML Document Object Model(DOM ), чтобы обеспечить доступ к данным в XML -документах, и дополнительные классы для чтения, записи и навигации в пределах XML -документа. Эти классы поддерживаются пространством имен System.XML . Пример представления описания каталога книг в модели DOM приведен на рис. 8.1.

Описание документа на языке XML включает в себя операторы, написанные с соблюдением требований его синтаксиса. При создании XML -документа вместо использования ограниченного набора определенных элементов имеется возможность создавать собственные элементы и присваивать им любые имена по выбору пользователя. Именно поэтому язык XML является расширяемым (extensible). Следовательно, этот язык можно использовать для описания практически любого документа: от музыкальной партитуры до базы данных.

Katalog

Рис. 8.1. Иерархическая структура документа

Например, каталог книг можно описать так, как показано в листинге 8.1 (номера строк не являются частью документа XML ). Для создания XML -документа в среде Visual Studio . NET следует воспользоваться командой File \ New File и в выпавшем списке шаблонов выбрать имя шаблона XML File .

Листинг 8.1 . Текст XML -документа

    С#2005 для профессионалов

    Кристиан Нейгел

    1560

    800

    2006

    С# в задачах и примерах

    Никита Культин

    240

    350

    2007

В строке 1 данного листинга записано объявление XML , идентифицирующее текст как документ XML .Несмотря на необязательность объявления XML , документ должен включать его в себя для идентификации используемой версии XML , поскольку документ без объявления XML может в дальнейшем рассматриваться как соответствующий последней версии XML, в результате чего могут появиться ошибки. Информационный параметр version указывает версию XML , использованную в документе, параметр encoding – кодировку документа (utf-8 ).

В строке2 записан комментарий, начинающийся с символов . Комментарии можно размещать по всему XML -документу.

В XML -документе данные маркируются с помощью тэгов (элементов ), представляющих собой имена, заключенные в угловые скобки (< > ). Имена тэгов в XML -документе (такие как KATALOG , BOOK , TITLE , AUTHOR ,PAGES ,PRICE , PDATA в листинге 8.1) не являются определениями языка XMLи назначаются при создании документа. Для тэгов можно выбирать любые корректно заданные имена, например INVENTORY вместо KATALOG либо ITEM вместо BOOK . В строке 3 записан корневой тэг – KATALOG , открывающий разметку всего документа. При завершении написания корневого тэга среда автоматически вставляет конечный тэг (строка 18 листинга 8.1), отмечая его символами .

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

Внутри корневого элемента может находиться произвольное количество вложенных элементов. В листинге 8.1 XML -документ имеет иерархическую структуру в виде дерева с элементами, вложенными в другие элементы, и с одним элементом верхнего уровня элемент Документ , или Корневой элемент (в нашем примере – KATALOG ), который содержит все другие элементы. Корневой элемент KATALOG включает в себя элементы-потомки BOOK . В свою очередь элемент BOOK состоит из элементов-потомков TITLE , AUTHOR ,PAGES ,PRICE , PDATA .

Корректно сформированные XML-документы. Документ называется корректно сформированным (well-formed), если он соответствует следующему минимальному набору правил для XML -доку-ментов:

XML -документ должен иметь только один корневой элемент – элемент Документ . Все другие элементы должны быть вложены в корневой элемент;

– элементы должны быть вложены упорядоченным образом. Если элемент начинается внутри другого элемента, то он должен и заканчиваться внутри этого элемента;

– каждый элемент должен иметь начальный и конечный тэги. В отличие от языка HTML, в языке XML не разрешается опускать конечный тэг даже в том случае, когда браузер в состоянии определить, где заканчивается элемент;

– название элемента в начальном тэге должно точно соответствовать (с учетом регистра) названию в соответствующем конечном тэге;

– название элемента должно начинаться с буквы или с символа подчеркивания (_ ), после чего могут идти буквы, цифры, а также символы: точка (. ), тире (- ) или подчеркивание.

Это базовые правила корректного формирования XML -документа. Для других понятий языка XML (атрибутов, примитивов, связей) действуют свои правила, которые необходимо соблюдать. Можно сказать, что если документ создан правильно и при его отображении и использовании не возникает никаких ошибок, то это и есть корректно сформированный документ. Если вы ошибетесь в каком-либо тэге HTML -страницы, то браузер просто проигнорирует соответствующий тэг, а ошибка в тэге XML -страницы сделает невозможным ее отображение. При наличии одной из ошибок встроенный в Internet Explorer анализатор (его иногда называют XML -про-цессором, или парсером) определяет ее позицию

Классы библиотеки FCL для чтения XML-файлов. Работу с XML -документами поддерживают следующие классы библиотеки FCL : XmlTextReader , XmlDocument , XPathNavigator .

Класс XmlTextReader – это абстрактный класс, выполняющий чтение и обеспечивающий быструю доставку некэшированных данных.Этот подход в отношении серверных ресурсов является наименее дорогостоящим, но он принуждает извлекать данные последовательно, от начала до конца.

КлассXmlDocument представляет собой реализацию модели DOM . Этот класс удерживает данные в памяти после вызова метода Load () для извлечения их из файла или потока, обеспечивает древовидное представление документа в памяти с возможностями навигации и редактирования, а также позволяет модифицировать данные и сохранять их обратно в файл.

КлассXPathNavigator так же, как и класс XmlDocument , удерживает в памяти XML - документ целиком. Он предоставляет расширенные средства поиска данных, однако не обеспечивает возможности внесения изменений и их сохранения.

Класс XmlTextReader . Рассмотрим простой пример. Разместим на форме элементы richTextBox и button (рис. 8.2). При щелчке на кнопку в элемент richTextBox будет загружаться файл, содержимое которого было представлено в листинге 8.1. Код функции, вызываемой при щелчке на кнопку, показан в листинге 8.2.

Рис. 8.2. Результаты считывания из Xml -документа

Листинг 8.2 . Код обработчика щелчка по кнопке

//Очистка элемента richTextBox 1

richTextBox 1. Clear ();

// Вызов статического метода Create () , возвращающего объект класса

// Файл book.xml находится в том же месте, что и исполняемый файл

// программы

// Метод Read () перемещает на следующий узел Xml -документа

while (rdr.Read())

if (rdr.NodeType == XmlNodeType .Text)

richTextBox1.AppendText(rdr.Value + "\r\n");

Класс XmlReader также может читать данные со строгим контролем типов. Существует несколько методов ReadElementContentAs , выполняющих чтение, среди которых ReadElementContentAsDecimal() ,ReadElementContentAs Int () , ReadElementContentAs Boolean () и др.

В листинге 8.3 показано, как считывать значения в десятичном формате и выполнять над ними математические операции. В рассматриваемом случае цена элемента увеличивается на 25 %. Результаты выполнения этого кода показаны на рис. 8.3.

Рис. 8.3. Результаты считывания из Xml- документа

только названия и цены книг

Листинг 8.3 . Чтение данных со строгим контролем типов

// Очистка элемента richTextBox 1

richTextBox 1. Clear ();

// Создание потока для чтения из файла book . xml

XmlReader rdr = XmlReader.Create("book.xml");

while (rdr.Read())

if (rdr.NodeType == XmlNodeType.Element)

// Проверка имени элемента

if (rdr . Name == " PRICE ")

// Метод ReadElementContentAsDecimal () выполняет

// преобразование содержимого элемента к типу decimal

decimal price = rdr.ReadElementContentAsDecimal();

richTextBox1.AppendText(" Текущая цена = " + price +

"руб\ r \ n ");

// Изменение цены на 25 %

price += price * (decimal).25;

richTextBox1.AppendText(" Новая цена = " + price +

" руб \r\n\r\n");

else if (rdr.Name == "TITLE")

richTextBox1.AppendText(rdr.ReadElementContentAsString() + "\r\n");

Класс XmlDocument. Этот класс и производный от него класс XmlDataDocument используются в библиотеке .NET для представления объектной модели документа DOM .

В отличие от класса XmlReader , класс XmlDocument предла-гает возможности не только чтения, но и записи, а также произвольного доступа к дереву DOM .

Рассмотрим пример, в котором создается объект класса XmlDocument , загружается документ с диска и отображается окно списка с названиями книг (рис. 8.4).

Рис. 8.4. Отображение названий книг в списке.

В классе формы приложения создадим объект класса XmlDocument :

XmlDocument _doc = new XmlDocument();

Код обработчика щелчка по кнопке приведен в листинге 8.4.

_doc.Load("book.xml");

// Получить только те узлы, которые нужны

XmlNodeList nodeLst = _ doc . GetElementsByTagName (" TITLE ");

// Просмотр в цикле класса XmlNodeList

foreach (XmlNode node in nodeLst )

listBox 1. Items . Add (node . InnerText );

Введем в приложение возможность вывода свдений о книге, наз-вание которой выделено в списке, для чего добавим обработчик события listBox 1_ SelectedIndexChanged так, как показано в листинге 8.5.

Листинг 8.5 . Обработчик щелчка по элементу списка

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)

// Создание строки поиска

string srch = "KATALOG/BOOK";

// Поиск дополнительных данных

XmlNode foundNode = _doc.SelectSingleNode(srch);

if (foundNode != null)

MessageBox.Show(foundNode.OuterXml);

MessageBox.Show("Not found");

Результаты работы приложения показаны на рис. 8.5.

Рис. 8.5. Вывод сведений о выделенном элементе списка

С помощью класса XmlDocument такжеможно вставлять узлы в существующий документ, для чего используется метод Create - Element () .

Например, для создания нового элемента BOOK необходимо записать следующий код:

XmlElement newBook = _doc.CreateElement("BOOK");

Создать элементы, вложенные в элемент BOOK , можно с помощью следующего кода:

// Создание нового элемента AUTOR

XmlElement newAuthor = _doc.CreateElement("AUTOR");

newAuthor.InnerText = "C. Байдачный ";

Полный код обработчика щелчка по кнопке приведен в лис-тинге 8.6, результаты его работы показаны на рис. 8.6.

Листинг 8.6 . Обработчик щелчка по кнопке

private void button 1_ Click (object sender , EventArgs e )

_doc.Load("book.xml");

XmlElement newBook = _doc.CreateElement("BOOK");

// Создание нового элемента TITLE

XmlElement newTitle = _doc.CreateElement("TITLE");

newTitle.InnerText = ".NET Framework 2.0";

newBook.AppendChild(newTitle);

// Создание нового элемента AUTOR

XmlElement newAuthor = _doc.CreateElement("AUTOR");

newAuthor.InnerText = "C. Байдачный ";

newBook.AppendChild(newAuthor);

// Создание нового элемента PAGES

XmlElement newpages = _doc.CreateElement("PAGES");

newpages.InnerText = "498";

newBook.AppendChild(newpages);

// Создание нового элемента PRICE

XmlElement newprice = _doc.CreateElement("PRICE");

newprice.InnerText = "590";

newBook.AppendChild(newprice);

// Создание нового элемента PDATA

XmlElement newpdata = _doc.CreateElement("PDATA");

newpdata.InnerText = "2006";

newBook.AppendChild(newpdata);

// Добавление в текущий документ

_doc.DocumentElement.AppendChild(newBook);

// Запись документа на диск

XmlTextWriter tr = new XmlTextWriter("bookEdit.xml", null);

tr.Formatting = Formatting.Indented;

_doc.WriteContentTo(tr);

tr . Close ();

XmlNodeList nodeLst = _ doc . GetElementsByTagName (" TITLE ");

// Просмотр в цикле класса XmlNodeList

foreach (XmlNode node in nodeLst )

listBox 1. Items . Add (node . InnerText );

При использовании классовXmlDocument иXmlReader необходимо учитывать следующие особенности. Если требуется возможность произвольного доступа к документу, то следует применять класс XmlDocument , а если нужна потоковая модель, то классы, основанные на классе XmlReader . Класс XmlDocument отличается большой гибкостью, но его требования к памяти являются более высокими, чем у классаXmlReader , а производительность при считывании документа – более низкой.

Рис. 8.6. Окно работающего приложения

с добавленным узлом

Класс XPathNavigator . КлассXPathNavigator является частью пространства имен System . Xml . XPath , созданного для увеличения быстродействия. Это пространство обеспечивает только чтение документов, следовательно средства редактирования в нем отсутствуют, а классы построены так, чтобы обеспечить быстрое выполнение на заданном XML -документе циклов и операций выбора в стиле курсора.

Наилучшим способом использования классов из пространства имен System . Xml . XPath является просмотр документа book . xml в цикле.

Разместим на форме элементы listBox и button . Код обра-ботчика щелчка по кнопке приведен в листинге 8.7, результаты выполнения этого кода – на рис. 8.7.

Листинг 8.7 . Обработчик щелчка по кнопке

private void button 1_ Click (object sender , EventArgs e )

// Создание объекта с именем doc класса XPathDocument и передача

// в его конструктор имени XML - файла book.xml

XPathDocument doc = new XPathDocument("book.xml");

// Создание объекта с именем nav класса XPathNavigator на базе объекта

// XPathDocument. Объект nav может использоваться только для чтения

XPathNavigator nav = ((IXPathNavigable)doc). CreateNavigator();

// Создание объекта XPathNodeIterator для узлов каталога

// и его дочерних узлов

XPathNodeIterator iter = nav.Select("/KATALOG/BOOK");

while (iter.MoveNext())

// Метод SelectDescendants() класса XPathNavigator выбирает все

// узлы-потомки текущего узла, соответствующие условиям выбора

XPathNodeIterator newIter =

Поддержка XML впервые появилась в SQL Server 2000 - в язык T-SQL были добавлены ключевые слова FOR XML и OPENXML, которые позволяли разработчикам, соответственно, извлекать результаты запросов к базам данных в виде XML-потока и сохранять XML-документы в базе данных. Эти возможности были существенно расширены в SQL Server 2005 - был введен новый тип данных XML, поддерживающий проверку на уровне XSD_схемы, выполнение XQuery_операций и индексирование. В SQL Server 2008 возможности по работе с XML, как со встроенным типом данных, еще больше расширены.

Начнем с того, что кратко вспомним ключевые возможности по работе с XML, реализованные в предыдущих версиях SQL Server - SQL Server 2000 и SQL Server 2005.
Как я отметил выше, в SQL Server 2000 в язык T-SQL были добавлены ключевые слова FOR XML и OPENXML. FOR XML - это атрибут команды SELECT, указывающий на то, что результаты выполнения запроса должны быть представлены в виде XML-потока. Пример использования данной функциональности показан ниже. Следующий запрос:

SELECT ProductID, ProductName

FROM Products Product

FOR XML AUTO

вернет следующий XML-документ:

< Product ProductID = "1" ProductName = "Widget" />

< Product ProductID = "2" ProductName = "Sprocket" />

Функция OPENXML предназначена для выполнения обратных действий - создания записи на основе переданного ей XML-документа. Пример использования данной функциональности показан ниже. Следующий запрос:

DECLARE @doc nvarchar(1000)

SET @doc = "

"

DECLARE @xmlDoc integer

EXEC sp_XML-preparedocument @xmlDoc OUTPUT , @doc

SELECT * FROM

OPENXML (@xmlDoc, "Order/Item" , 1)

WITH

(OrderID integer "../@OrderID" ,

ProductID integer ,

Quantity integer)

EXEC sp_XML-removedocument @xmlDoc

приведет к созданию такой записи:

OrderID ProductID Quantity

1011 1 2

1011 2 1

Обратите внимание на использование хранимых процедур sp_XML-preparedocument и sp_XML-removedocument для создания XML-документа в памяти и его удаления после записи в базу данных.

В SQL Server 2005 атрибут FOR XML был расширен возможностью задания новых опций для корневых элементов и имен элементов документа, была включена поддержка вложенных вызовов запросов с FOR XML, позволяю щих создавать сложные иерархии внутри XML-документов, а также новый режим PATH, позволяющий описать структуру получаемого XML-документа с помощью синтаксиса XPath. Пример использования данной функциональности показан ниже. Следующий запрос:

SELECT ProductID AS "@ProductID" ,

ProductName AS "ProductName"

FROM Products

FOR XML PATH ("Product"), ROOT ("Products")

создаст такой XML-документ:

Widget

Sprocket

Помимо расширений функциональности, впервые появившейся в SQL Server 2000, в SQL Server 2005 появился встроенный тип данных XML, использование которого позволяет создавать переменные и колонки для хранения XML-данных. Пример использования данной функциональности показан ниже.

CREATE TABLE SalesOrders

OrderDate datetime,

CustomerID integer ,

OrderNotes xml)

Тип данных xml может использоваться для хранения в базе данных отформатированных документов (HTML, XML, XHTML и т. п.) или полуструктурированных данных. Можно хранить нетипизованные или типизованные XML-данные - последние могут быть проверены на соответствие XSD-схеме. Для задания схемы, используемой для проверки вводимых данных, используется команда СREATE XML SCHEMA COLLECTION:


После того как схема описана, она ассоциируется с XML-переменной или колонкой соответствующего типа - пример показан ниже.

CREATE TABLE SalesOrders

(OrderID integer PRIMARY KEY ,

OrderDate datetime,

CustomerID integer ,

OrderNotes xml(ProductSchema))

Проверка типизованного XML на соответствие ассоциированной с переменной или колонкой соответствующего типа схеме происходит при записи или обновлении данных - эта возможность позволяет, например, гарантировать соответствие вводимых данных принятым стандартам или обеспечить совместимость с документами различных типов.
Тип данных xml также поддерживает ряд методов, которые могут использоваться для выполнения запросов или манипуляции с XML-данными. Например, можно использовать метод query для выборки данных, как это показано в следующем примере:

Declare @x xml

Set @x=

"

Kim Abercrombie

Margaret Smith

"

SELECT @x.query(

"

For $invoice in /Invoices/Invoice

Return $invoice/Customer

")

В приведенном выше запросе используется XQuery_синтаксис, с помощью которого ищутся все элементы Invoice, находящиеся в данном документе, и возвращается XML-документ, который содержит элемент Customer для каждого элемента Invoice - пример результирующего документа показан ниже.

< CustomerList >

< Customer >Kim Abercrombie

< Customer >Margaret Smith

Другая новинка, относящаяся к поддержке XML и появившаяся в SQL Server 2005 - это поддержка XML-индексов. Имеется возможность создания первичных и вторичных XML-индексов для колонок типа xml, что позволяет повысить производительность запросов к XML-данным. Первичный XML-индекс - это сжатое представление все ветвей XML-документа, которые процессор обработки запросов использует для быстрого нахождения ветвей в документе. После того как первичный XML-индекс создан, можно создать вторичный XML-индекс, который поможет повысить производительность при выполнении ряда специфических запросов. В следующем примере показано, как создать первичный XML-индекс и вторичный XML-индекс типа PATH, который позволит улучшить производительность при выполнении XPath_ запросов к данному XML-документу.

CREATE PRIMARY XML INDEX idx_XML-Notes

ON SalesOrders (Notes)

CREATE XML INDEX idx_XML-Path_Notes

ON SalesOrders (Notes)

USING XML INDEX idx_XML-Notes

FOR PATH


Функциональность, реализованная в SQL Server 2000 и 2005, была расширена в SQL Server 2008. К ключевым расширениям в области поддержки работы с XML в SQL Server 2008 можно отнести улучшенные возможности проверки данных на соответствие схеме, расширенную поддержку XQuery и расширенную функциональность при вставке XML-данных средствами DML (Data Manipulation Language).

Расширения XSD
Проверка данных на соответствие схеме позволяет убедиться в том, что XML-документ, хранимый в SQL Server, соответствует определенному стандарту и заданным на уровне схемы бизнес_правилам. На уровне схемы задаются допустимые в XML-документе элементы и атрибуты, что позволяет убедиться в том, что XML-документ содержит требуемые данные в рамках предопределенной структуры.
В SQL Server 2005 появилась поддержка проверки XML-данных на основе коллекций XSD_ схем. Подход заключается в том, что вы создаете коллекцию схем, которая содержит схемы с правилами для XML-данных, используя команду CREATE XML SCHEMA COLLECTION, а затем ссылаетесь на имя коллекции при задании колонки или переменной типа xml, которая должна соответствовать правилам, описанным на уровне схемы.
SQL Server выполняет проверку вводимых или обновляемых данных на соответствие указанной коллекции схем. В SQL Server 2005 реализовано подмножество полной спецификации XML Schema и поддерживаются ключевые сценарии проверки вводимых XML-данных.
В SQL Server 2008 поддержка XSD_схем расширена за счет введения дополнительных возможностей, к которым относятся поддержка проверки на уровне any (т. н. lax validation), полная поддержка проверки на уровне dateTime, time и date, включая сохранение информации о часовых поясах и улучшенная поддержка типов union и list.
Поддержка проверки на уровне шаблонов реализована на уровне конструкций any, anyAttribute и anyType. Например, следующая схема:

< xs:complexType name = "Order" mixed = "true" >

< xs:sequence >

< xs:element name = "CustomerName" />

< xs:element name = "OrderTotal" />

< xs:any namespace = "##other" processContents = "skip" minOccurs = "0" maxOccurs = "unbounded" />

задает XML-элемент с именем Order, который должен содержать вложенные элементы с именами CustomerName и OrderTotal. Помимо этого, элемент может содержать неограниченное число других элементов, относящихся к пространствам имен, отличным от того, в котором определен тип Order.
Следующий XML-документ содержит экземпляр элемента Order, соответствующий описанию схемы. Обратите внимание на то, что в документе также содержится элемент shp:Delivery, который не описан в схеме.

< Order >

< CustomerName >Graeme Malcolm

< OrderTotal >299.99

< shp:Delivery >Express


Проверка на соответствие шаблону зависит от атрибута processContents для секции схемы, в которой описываются шаблоны. В SQL Server 2005 схемы могут содержать значения атрибута processContents - skip и strict для объявлений any и anyAttribute. В предыдущем примере атрибут processContents для шаблона имел значение skip - таким образом, содержимое данного элемента не проверялось. Даже если в схеме описан элемент shp:Delivery, он не будет проверяться до тех пор, пока в описании шаблона для элемента Order значение атрибута processContents не будет установлено в strict.

В SQL Server 2008 добавлено третье возможное значение атрибута processContents - lax, которое позволяет указать на то, что все элементы, описанные в схеме, должны быть включены в проверку, а элементы, не содержащиеся в схеме, могут быть проигнорированы. Таким образом, если в предыдущем примере присвоить атрибуту processContents для шаблона значение lax, и добавить в схему описание элемента shp:Delivery, этот элемент будет включен в проверку. Но так как элемент shp:Delivery не описан в схеме, он не будет включен в проверку. Помимо этого, спецификация XML Schema определяет, что атрибут anyType автоматически подлежит проверке согласно описанным выше правилам. В SQL Server 2005 lax-проверка не поддерживалась - по умолчанию выполнялась проверка на уровне strict.
Для задания данных, описывающих дату и время, в XML-схемах используется тип данных dateTime. Дата и время задаются в следующем формате: 2007 12 01T21:11:20:000Z, который представляет собой 1-е декабря 2007 года, 11 часов 20 минут по Гринвичу - UTC (000Z). Другие часовые пояса в следующем формате: 000+3:00, например, описывает московское время. Спецификация XML Schema задает компонент часового пояса типов данных dateTime, date и time как опциональный. Тем не менее, в SQL Server 2005 требовалось указание часового пояса при задании данных типа date_Time, date и time.
Помимо этого, в SQL Server 2005 данные о часовом поясе не сохранялись, а приводились к UTC - например, значение 2007_12_25T06:00:00:000_8:00 превращалось в 2007_12_25T14:00:00:000Z. В SQL Server 2008 эти ограничения удалены - при задании даты и времени можно не указывать часовой пояс, но если он указан, данные сохраняются корректно.
Разработчики могут использовать XML-схемы для задания типов данных для XML-данных так, что эти данные могут содержать набор значений, присваиваемых элементам и атрибутам. Например, можно определить тип sizeListType, который ограничивает список возможных значений, присваиваемых элементу AvaliableSizes до S, M и L. В SQL Server 2005 поддерживаются схемы, содержащие простые определения типов и соответствующие ограничения. Например, можно использовать тип list для задания возможных размеров, как показано в следующем примере:

< xs:simpleType name = "sizeListType" >

< xs:list >

< xs:simpleType >

< xs:restriction base = "xs:string" >

< xs:enumeration value = "S" />

< xs:enumeration value = "M" />

< xs:enumeration value = "L" />


Такое описание схемы позволяет создать элемент, который содержит все возможные размеры в виде списка значений, разделенных пробелами - это показано в следующем примере:

< AvailableSizes >S M L

Microsoft Excel – удобный инструмент для организации и структурирования самых разнообразных данных. Он позволяет обрабатывать информацию разными методами, редактировать массивы данных.

Рассмотрим возможности использования его для формирования и обработки файлов веб-приложений. На конкретном примере изучим основы работы с XML в Excel.

Как создать XML-файл из Excel

XML – стандарт файла для передачи данных в Сети. Excel поддерживает его экспорт и импорт.

Рассмотрим создание XML-файла на примере производственного календаря.

  1. Сделаем таблицу, по которой нужно создать XML файл в Excel и заполним ее данными.
  2. Создадим и вставим карту XML с необходимой структурой документа.
  3. Экспортируем данные таблицы в XML формат.

Сохраняем в XML файл.

Другие способы получения XML-данных (схемы):

  1. Скачать из базы данных, специализированного бизнес-приложения. Схемы могут предоставляться коммерческими сайтами, службами. Простые варианты находятся в открытом доступе.
  2. Использовать готовые образцы для проверки карт XML. В образцах – основные элементы, структура XML. Копируете – вставляете в программу «Блокнот» - сохраняете с нужным расширением.


Как сохранить файл Excel в формате XML

Один из вариантов:

  1. Нажимаем кнопку Office. Выбираем «Сохранить как» - «Другие форматы».
  2. Назначаем имя. Выбираем место сохранения и тип файла – XML.

Еще варианты:

  1. Скачать конвертер XLC в XML. Либо найти сервис, с помощью которого можно экспортировать файл онлайн.
  2. Скачать с официального сайта Microsoft надстройку XML Tools Add-in. Она в бесплатном доступе.
  3. Открываем новую книгу. Кнопка Office – «Открыть».

Как открыть XML файл в Excel

Жмем ОК. С полученной таблицей можно работать, как с любым файлом Excel.

Как преобразовать файл XML в Excel

Созданную таблицу редактируем и сохраняем уже в формате Excel.

Как собрать данные из XML файлов в Excel

Принцип сбора информации из нескольких XML-файлов такой же, как и принцип преобразования. Когда мы импортируем данные в Excel, одновременно передается карта XML. В эту же схему можно переносить и другие данные.

Каждый новый файл будет привязываться к имеющейся карте. Каждому элементу в структуре таблицы соответствует элемент в карте. Допускается только одна привязка данных.

Чтобы настроить параметры привязки, откройте в меню «Разработчик» инструмент «Свойства карты».


Возможности:

  1. Каждый новый файл будет проверяться программой Excel на соответствие установленной карте (если поставим галочку напротив этого пункта).
  2. Данные могут обновляться. Либо новая информация добавится в существующую таблицу (имеет смысл, если нужно собрать данные из похожих файлов).

Это все ручные способы импорта и экспорта файлов.

Уже довольно много времени прошло с тех пор, как я пообещал рассказать о работе с данными в формате XML при разработке.NET-приложений. Обещания надо выполнять. Прошу только учесть, что эта статья ориентирована не на профессиональных.NET-разработчиков, а на тех, кто ещё не имеет существенного опыта создания.NET-приложений.


Зачем нам работать с XML?

Если вы ещё не очень хорошо представляете себе, что такое XML, то рекомендую прочитать статью "XML - это всерьёз и надолго" в "КВ" № за 2007-й год. Чтобы сэкономить место для более важных вещей, здесь сам формат XML разбираться не будет.

Перед тем, как начинать знакомиться с программным кодом, нужно ответить на один принципиальный вопрос: зачем вообще включать поддержку XML в своё приложение? Думаю, что многие задавали себе этот вопрос относительно многих технологий, и не все после ответа были включены в приложения. Впрочем, с XML дело обстоит несколько иначе, и существуют реальные поводы использовать этот формат во многих ситуациях.

Главное преимущество XML в том, что, будучи по природе текстовым форматом, он, тем не менее, прекрасно позволяет хранить и передавать любые данные. Поскольку этот формат текстовый, то сама собой решается проблема его кросс-платформенности, и точно так же легко решается проблема передачи XML-данных (как это, например, сделано в SOAP). Кроме того, можно без проблем изменять формат передачи или хранения данных, добавляя новые атрибуты и не сильно беспокоясь о совместимости с предыдущими версиями формата, поскольку приложения, использующие старую версию, смогут прочитать то, что им надо, не обращая внимания на новые теги или атрибуты. Многие приложения используют основанные на XML файловые форматы, многие протоколы передачи данных тоже основаны на XML, и списки тех и других продолжают расти.

Конечно, с другой стороны, XML не очень экономичен, потому что, как когда-то верно заметил один из посетителей форума "Компьютерных вестей", часто XML-документы состоят на 10% из данных и на 90% из тегов. Впрочем, это уже в значительной степени зависит от того, какие вы сами выберете теги. Можно написать ул. Мельникайте, 2, а можно . Хотя, если честно, мне кажется, что с нынешними винчестерами и толстыми каналами нет смысла особенно ужиматься.

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

Для программирования мы будем использовать основной язык платформы.NET - C#. Для того, чтобы как можно больше читателей могли сами поупражняться с приведенным программным кодом, я буду использовать первую версию C# и.NET Framework"а.


Запись данных

Сначала поговорим о записи данных, поскольку, сами понимаете, чтобы что-то откуда-то считывать, нужно сначала что-то куда-то и записать. А коль скоро мы с вами занялись программированием, то создавать XML-данные "ручками" нам с вами не пристало. Поэтому давайте сначала займёмся записью данных в XML.

Для начала создайте новый проект в Visual Studio, #Develop"е или C# Builder"е, и в список импортируемых namespace"ов добавьте System.Xml.

За запись XML-данных в.NET Framework"е отвечает специальный класс XmlTextWriter, который позволяет записывать XML-данные в произвольный поток. То есть, мы, вообще говоря, можем записать их с его помощью и в файл, и в базу данных, и отправить кому-то через Интернет, однако сейчас мы будем писать всё именно в файл. Вы можете перенаправить вывод, изменив конструктор объекта (т.е. передав при инициализации не имя файла и его кодировку, а объект, являющийся потоком данных). Впрочем, я, кажется, уже стал забегать немного вперёд. Давайте сначала познакомимся с кодом, ответственным за запись данных в наш с вами XML-файл.

String FileName = "c:\\demo.xml"; XmlTextWriter xml = new XmlTextWriter(FileName, System.Text.Encoding.Unicode); xml.Formatting = Formatting.Indented; xml.WriteStartDocument(); xml.WriteStartElement("rootelement"); for (int i = 0; i < 10; i++) { xml.WriteStartElement("subelement"); xml.WriteAttributeString("attrib1", "value1"); xml.WriteAttributeString("attrib2", i.ToString()); for (int j = 0; j < 10; j++){ xml.WriteStartElement("subsubelement"); xml.WriteAttributeString("attr", j.ToString()); xml.WriteEndElement(); } xml.WriteEndElement(); } xml.WriteEndElement(); xml.WriteEndDocument(); xml.Close();

Первая строка, думаю, вполне ясна - это просто запись имени файла, в который мы будем сохранять данные. Дальше мы создаём объект типа XmlTextWriter (он называется, как видите, xml), и именно с ним мы будем производить все дальнейшие операции. Заметьте, что при конструировании объекта мы указываем и кодировку, в которой будет записываться XML: в нашем примере это Unicode. Следующая строчка, вообще говоря, не обязательна, однако она сделает наш XML-документ, что называется, human readable, то есть добавит нужные отступы и разобьёт его на строки. Без этого весь документ был бы записан одной строкой, что, хотя и экономит место, но делает его практически непригодным для ручного редактирования.

Начинается запись документа с вызова метода WriteStartDocument() нашего объекта xml. Следующая за ней строчка добавляет корневой элемент "rootelement" в наш XML-документ (напомню, для XML-документов корневой элемент должен присутствовать в единственном экземпляре). Далее мы в цикле добавляем ещё десять не несущих никакой смысловой нагрузки элементов в наш с вами XML-документ, для каждого из которых устанавливаем два атрибута и ещё по десять подэлементов. Обратите внимание, что мы можем добавлять к строке число без явной конвертации данных, а вот если число должно целиком образовывать строку, то его нужно преобразовывать явно методом ToString(). Также обратите внимание, что мы должны явно закрывать каждый из элементов нашего XML-документа, а также потом и весь документ целиком.

Теперь, когда наш XML-документ успешно записан, давайте посмотрим, каким образом можно считать из него данные.


Чтение данных

Добавьте на форму вашего приложения (если, конечно, оно у вас не консольное) компонент listBox для того, чтобы можно было следить за результатом чтения XML-файла. Ну а если ваша программа консольная , то вы с лёгкостью сможете перенаправить вывод на консоль.

Как обычно, сначала ознакомимся с кодом программы, а потом уже будем смотреть, что именно этот код делает.

XmlTextReader xml = new XmlTextReader(FileName); xml.WhitespaceHandling = WhitespaceHandling.None; int i = 0; while (xml.Read()){ if ((xml.NodeType == XmlNodeType.Element) & (xml.Name == "subelement")) { listBox1.Items.Add("subelement " + i + " found"); i++; listBox1.Items.Add(" " + xml.GetAttribute("attrib1")); listBox1.Items.Add(" " + xml.GetAttribute("attrib2")); while (xml.Read()&(xml.Name == "subsubelement")){ listBox1.Items.Add(" " + xml.GetAttribute("attr")); } } } xml.Close();

Для чтения, как вы могли заметить, мы используем уже другой класс, а именно - XmlTextReader. Он находится в том же пространстве имён, что и класс, который мы использовали для записи данных. В первой строчке мы создаём экземпляр XmlTextReader"а, имеющий имя xml (здесь мы предполагаем, что переменная FileName уже определена нами ранее). Чтобы пропускать пустые строки, ежели такие неким непостижимым образом возникнут в нашем только что созданном XML-файле, мы используем следующую строку в приведенном фрагменте кода. Переменная i используется для подсчёта количества найденных элементов "subelement" в XML-файле, из которого производится считывание данных.

Дальше идёт цикл непосредственного чтения данных из файла. Метод Read() считывает следующий элемент XML-документа, и после его считывания мы проверяем, что именно мы считали. Если это действительно элемент "subelement", то мы добавляем информацию о считанном элементе в listBox1, инкрементируем переменную, содержащую количество считанных элементов, а затем считываем атрибуты элемента. После чтения атрибутов мы организуем отдельный цикл для чтения подэлементов "subsubelement" (обратите внимание, что для этого нам не требуется отдельного XmlTextReader"а) и атрибутов этих подэлементов. Как и ранее, все считанные сведения мы заносим в listBox1, чтобы контролировать правильность чтения.

При чтении XML-файлов, точно так же, как и при их записи, при конструировании XmlTextReader"а можно указать в качестве параметра поток, из которого будет производиться чтение, и тогда читать можно будет не только из файлов, но также и из других источников, примеры которых я уже приводил выше. Следует отметить одну полезную особенность класса XmlTextReader: при чтении он не загружает в память весь читаемый XML-документ, поэтому с его помощью удобно проводить разбор больших XML-документов (например, XML баз данных).


За кадром

В общем-то, пример, который мы с вами только что разобрали, чересчур прост для реальных проектов. В наше время при чтении XML-документов, как правило, применяется их валидация с помощью DTD, XML Schema или Relax NG. Валидация - это проверка соответствия разметки XML-документа некоторому стандарту, описываемому во внешнем файле. Валидация нужна для того, чтобы проверка документа не была жёстко зашита в алгоритм программы, а могла изменяться произвольным образом при изменении в формате данных без обновления считывающего или записывающего данные программного кода. К сожалению, сейчас мы с вами уже разобрать валидацию не успеем, поскольку, как вы сами понимаете, объём газетной статьи имеет определённые ограничения.

Ещё один интересный и полезный практический момент, касающийся работы с XML-данными, - это XSL-преобразование данных. Это преобразование применяется к данным при их отображении на HTML-страницах и, фактически, просто является применением определённого шаблона web-страницы к XML-файлу с какими-либо данными. Поскольку львиная доля теперешнего использования XML-данных так или иначе приходится на World Wide Web, то и XSL-преобразования рассмотреть было бы очень и очень неплохо.

Так что, думаю, у этой статьи будет продолжение - но, конечно, только в том случае, если вы сами (то есть читатели "Компьютерных вестей") об этом попросите на форуме или в письме на мой электронный почтовый адрес. Пока же об использовании XML в.NET-приложениях, пожалуй, всё. Надеюсь, что эта информация будет полезной для вас.