Книга: Обработка баз данных на Visual Basic®.NET
Запись XML-данных
Разделы на этой странице:
Запись XML-данных
После загрузки в объект DataSet (независимо от способа и места загрузки) данные и/или схемы данных можно записать в XML-формате (с XML-схемой или без нее). Для демонстрации способов записи данных в XML-формате выполните перечисленные ниже действия.
1. Создайте в форме новую кнопку сразу под кнопкой Read XML, перетаскивая ее из панели инструментов.
2. В окне свойств Properties укажите значение btnWriteXML для свойства (Name) и значение Write XML для свойства Text этой кнопки.
3. Затем в определении класса формы frmXML введите код из листинга 10.3.
Листинг 10.3. Код сохранения содержимого объекта DataSet в виде XML-файла
Private Sub btnWriteXML_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnWriteXML.Click
Dim dsSales As New DataSet()
Dim en As New SqlConnection _
("data source=localhost;initial catalog=pubs;user>
Dim daAuthors As New SqlDataAdapter("select * from sales", en)
Dim daPublishers As New SqlDataAdapter("select * from stores", en)
' Загрузка реляционных данных из базы данных.
daAuthors.Fill(dsSales, "Sales")
daPublishers.Fill(dsSales, "Stores")
' Запись XML-данных в файл
dsSales.WriteXml("…StoreSales.xml")
' Запись схемы в XSD-файл.
dsSales.WriteXmlSchema("…StoreSales.xsd")
End Sub
В этой подпрограмме создаются два объекта — адаптера данных (daAuthors и daPublishers), которые затем используются для вставки данных в объект dsPubs из двух таблиц базы данных pubs СУБД SQL Server. В листинге 10.4 приведено содержимое файла StoreSales.xml, который создается в результате выполнения этой подпрограммы. Обратите внимание на то, что данный XML-документ содержит записи о продажах, а затем записи о магазинах. Этот подход имеет смысл, так как между ними не задано никакого отношения. Если бы таблицы Sales и Stores были связаны, то эти записи можно было вложить друг в друга. Пример такого вложения приводится далее, в бизнес-ситуации 10.1.
ЛИСТИНГ 10.4. Содержимое файла StoreSales.xml
<?xml version="1.0" standalone="yes"?>
<NewDataSet>
<Sales>
<stor_id>6380</stor_id>
<ord_num>6871</ord_num>
<ord_date>l994-09-14T00:00:00.0000000+02:00</ord_date>
<qty>5</qty>
<payterms>Net 60</payterms>
<title_id>BU1032</title_id>
</Sales>
<Sales>
<stor_id>6380</stor_id>
<ord_num>722a</ord_num>
<ord_date>l994-09-13T00:00:00.0000000+02:00</ord_date>
<qty>3</qty>
<payterms>Net 60</payterms>
<title_id>PS2091</title_id>
</Sales>
<Sales>
<stor_id>7066</stor_id>
<ord_num>A2976</ord_num>
<ord_date>1993-05-24T00:00:00.0000000+02:00</ord_date>
<qty>50</qty>
<payterms>Net 30</payterms>
<title_id>PC8888</title_id>
</Sales>
<Sales>
<stor_id>7066</stor_id>
<ord_num>QA7442.3</ord_num>
<ord_date>1994-09-13T00:00:00.0000000+02:00</ord_date>
<qty>75</qty>
<payterms>ON invoice</payterms>
<title_id>PS209K/title_id>
</Sales>
<Sales>
<stor_id>7067</stor_id>
<ord_num>D4482</ord_num>
<ord_date>1994-09-14T00:00:00.0000000+02:00</ord_date>
<qty>10</qty>
<payterms>Net 60</payterms>
<title_id>PS2091</title_id>
</Sales>
<Sales>
<stor_id>7067</stor_id>
<ord_nurn>P2121</ord_num>
<ord_date>1992-06-15T00:00:00.0000000+02:00</ord_date>
<qty>40</qty>
<payterms>Net 30</payterms>
<title_id>TC3218</title_id> </Sales> <Sales>
<stor_id>7067</stor_id>
<оrd_num>P2121</ord_num>
<ord_date>1992-06-15T00:00:00.0000000+02:00</ord_date>
<qty>20</qty>
<payterms>Net 30</payterms>
<title_id>TC4203</title_id>
</Sales>
<Sales>
<stor_id>7067</stor_id>
<ord_num>P2121</ord_num>
<ord_date>1992-06-15T00:00:00.0000000+02:00</ord_date>
<qty>20</qty>
<payterms>Net 30</payterms>
<title_id>TC7777</title_id>
</Sales>
<Sales>
<stor_id>7131</stor_id>
<ord_num>N914008</ord_num>
<ord_date>1994-09-14T00:00:00.0000000+02:00</ord_date>
<qty>20</qty>
<payterms>Net 30</payterms>
<title_id>PS2091</title_id> </Sales> <Sales>
<stor_id>7131</stor_id>
<оrd_num>N914014</оrd_num>
<ord_date>1994-09-14T00:00:00.0000000+02:00</ord_date>
<qty>25</qty>
<payterms>Net 30</payterms>
<title_id>MC3021</title_id>
</Sales>
<Sales>
<stor_id>7131</stor_id>
<ord_num>P3087a</ord_num>
<ord_date>1993-05-29T00:00:00.0000000+02:00</ord_date>
<qty>20</qty>
<payterms>Net 60</payterms>
<title_id>PS1372</title_id>
</Sales>
<Sales>
<stor_id>7131</stor_id>
<ord_num>P3087a</ord_num>
<ord_date>1993-05-29T00:00:00.0000000+02:00</ord_date>
<qty>25</qty>
<payterms>Net 60</payterms>
<title_id>PS2106</title_id> </Sales> <Sales>
<stor_id>7131</stor_id>
<ord_num>P3087a</ord_num>
<ord_date>1993-05-29T00:00:00.0000000+02:00</ord_date>
<qty>15</qty>
<payterms>Net 60</payterms>
<title_id>PS3333</title_id>
</Sales>
<Sales>
<stor_id>7131</stor_id>
<ord_num>P3087a</ord_num>
<ord_date>1993-05-29T00:00:00.0000000+02:00</ord_date>
<qty>25</qty>
<payterms>Net 60</payterms>
<title_id>PS7777</title_id>
</Sales>
<Sales>
<stor_id>7896</stor_id>
<ord_num>QQ2299</ord_num>
<ord_date>1993-10-28T00:00:00.0000000+02:00</ord_date>
<qty>15</qty>
<payterms>Net 60</payterms>
<title_id>BU7832</title_id>
</Sales>
<Sales>
<stor_id>7896</stor_id>
<ord_num>TQ456</ord_num>
<ord_date>1993-12-12T00:00:00.0000000+02:00</ord_date>
<qty>10</qty>
<payterms>Net 60</payterms>
<title_id>MC2222</title_id>
</Sales>
<Sales>
<stor_id>7896</stor_id>
<ord_num>X999</ord_num>
<ord_date>1993-02-21T00:00:00.0000000+02:00</ord_date>
<qty>35</qty>
<payterms>ON invoice</payterms>
<title_id>BU2075</title_id>
</Sales>
<Sales>
<stor_id>8042</stor_id>
<ord_num>423LL922</ord_num>
<ord_date>1994-09-14T00:00:00.0000000+02:00</ord_date>
<qty>15</qty>
<payterms>ON invoice</payterms>
<title_id>MC3021</title_id> </Sales> <Sales>
<stor_id>8042</stor_id>
<ord_num>423LL930</ord_num>
<ord_date>1994-09-14T00:00:00.0000000+02:00</ord_date>
<qty>10</qty>
<payterms>ON invoice</payterms>
<title_id>BU1032</title_id>
</Sales>
<Sales>
<stor_id>8042</stor_id>
<ord_num>P723</ord_num>
<ord_date>1993-03-11T00:00:00.0000000+02:00</ord_date>
<qty>25</qty>
<payterms>Net 30</payterms>
<title_id>BU1111</title_id>
</Sales>
<Sales>
<stor_id>8042</stor_id>
<ord_num>QA879.1</ord_num>
<ord_date>1993-05-22T00:00:00.0000000+02:00</ord_date>
<qty>30</qty>
<payterms>Net 30</payterms>
<title_id>PC1035</title_id>
</Sales>
<Stores>
<stor_id>6380</stor_id>
<stor_name>Eric the Read Books</stor_name>
<stor_address>788 Catamaugus Ave.</stor_address>
<city>Seattle</city>
<state>WA</state>
<zip>98056</zip>
</Stores>
<Stores>
<stor_id>7066</stor_id>
<stor_name>Barnum's</stor_name>
<stor_address>567 Pasadena Ave.</stor_address>
<state>CA</state>
<zip>92789</zip>
</Stores>
<Stores>
<stor_id>7067</stor_id>
<stor_name>News & Brews</stor_name>
<stor_address>577 First St.</stor_address>
<city>Los Gatos</city>
<state>CA</state>
<zip>96745</zip>
</Stores>
<Stores>
<stor_id>7131</stor_id>
<stor_name>Doc-U-Mat: Quality Laundry and Books</stor_name>
<stor_address>24-A Avogadro Way</stor_address>
<city>Remulade</city>
<state>WA</state>
<zip>98014</zip>
</Stores>
<Stores>
<stor_id>7896</stor_id>
<stor_name>Fricative Bookshop</stor_name>
<stor_address>89 Madison St.</stor_address>
<city>Fremont</city>
<state>CA</state>
<zip>90019</zip>
</Stores>
<Stores>
<stor_id>8042</stor_id>
<stor_name>Bookbeat</stor_name>
<stor_address>679 Carson St.</stor_address>
<city>Portland</city>
<state>OR</state>
<zip>89076</zip>
</Stores>
</NewDataSet>
В приведенном примере демонстрируется простейший способ записи данных из объекта DataSet в XML-файл. Помимо этого способа существуют другие варианты записи данных и схемы с помощью перегруженных версий метода WriteXML. Соответствующие им перегруженные версии метода ReadXML содержат второй параметр со значением XmlWriteMode. В табл. 10.2 приведено краткое описание членов перечисления XmlWriteMode.
Таблица 10.2. Перечисление XmlWriteMode
Имя члена перечисления | Описание |
---|---|
DiffGram | Записывает данные из объекта DataSet в виде объекта DiffGram с текущими исходными значениями всех записей |
WriteSchema | Записывает данные из объекта DataSet в XML-формате вместе с их схемой. Если объект DataSet содержит только схему, то записывается только схема. Если в объекте DataSet не определена схема, то ничего не записывается |
IgnoreSchema | Этот режим используется по умолчанию для записи содержимого объекта DataSet в XML-формате без схемы |
НА ЗАМЕТКУ
Объект DataSet имеет методGetXml, который возвращает XML-строку с данными из объекта DataSet. Точно такой же результат можно получить, используя метод со вторым параметром XmlWriteMode, который имеет значение IgnoreSchema. Извлечение данных в виде одной строки иногда позволяет более гибко программировать доступ к данным, но требует больших усилий, особенно если вам нужно всего лишь записать данные в файл.
Для записи схемы данных из объекта DataSet в отдельном XSD-файле (вместо встраивания ее в данные) предусмотрен метод WriteXmlSchema, который используется так, как показано ниже.
dsSales.WriteXmlSchema
В листинге 10.5 приведено содержимое файла StoreSales.xsd, полученного в результате выполнения этого метода.
Листинг 10.5. Содержимое файла StoreSales.xsd, который является схемой из объекта dsSales
<?xml version="1.0" standalone="yes"?>
<xs:schema xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="NewDataSet" msdata:lsDataSet="true">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="Sales">
<xs:complexType>
<xs:sequence>
<xs:element name="stor_id" type="xs:string" minOccurs="0" />
<xs:element name="ord_num" type="xs:string" minOccurs="0" />
<xs:element name="ord_date" type="xs:dateTime" minOccurs="0" />
<xs:element name="qty" type="xs:short" minOccurs="0" />
<xs:element name="payterms" type="xs:string" minOccurs="0" />
<xs:element name="title_id" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Stores">
<xs:complexType>
<xs:sequence>
<xs:element name="stor_id" type="xs:string" minOccurs="0" />
<xs:element name="stor_name" type="xs:string" minOccurs="0" />
<xs:element name="stor_address" type="xs:string" minOccurs="0" />
<xs:element name="city" type="xs:string" minOccurs="0" />
<xs:element name="state" type="xs:string" minOccurs="0" />
<xs:element name="zip" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
- Создание объекта для обмена данными между XML-файлом и формой
- Копирование данных из XML-файла в таблицу БД
- Основные принципы чтения и записи XML-данных
- Запись XML
- Запись и чтение DiffGram
- Чтение XML-данных
- Резервное копирование базы данных InterBase
- Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
- Резервное копирование многофайловых баз данных
- Восстановление из резервных копий многофайловых баз данных
- Владелец базы данных
- ЧАСТЬ IV. База данных и ее объекты.