Ответы на эти простые вопросы основаны на применении объекта XmlDataDocument. Он является производным от класса XmlDocument, но обладает расширенными возможностями. Помимо внутренней копии данных, он содержит XML-совместимые средства доступа к ним как к классу XmlDocument с помощью XML-узлов, а также реляционные средства доступа на основе объекта DataSet. Объект XmlDataDocument автоматически синхронизирует оба эти представления (или, иначе говоря, способа доступа) таким образом, чтобы любые изменения, выраженные в одной технологии, сразу же отображались средствами другой технологии. Такой подход позволяет легко смешивать и находить соответствие между разными источниками данных на основе разных технологий.
Для демонстрации этих средств вернитесь к проекту ADO-XML и выполните перечисленные ниже действия.
1. Вставьте еще две кнопки в форму frmXML сразу под кнопкой ExecuteXMLReader, перетаскивая их из панели элементов управления.
2. В окне свойств Properties укажите значение btnNavigateSQL для свойства (Name) и значение Navigate SQL для свойства Text первой кнопки.
3. В окне свойств Properties укажите значение btnAddRows для свойства (Name) и значение Add Rows to XML для свойства Text второй кнопки.
4. Для импорта пространства имен XPath включите строку кода Imports System.Xml.XPath в конце списка команд импорта в верхней части файла с кодом.
5. В код класса frmXML включите две подпрограммы.
Private Sub btnNavigateSQL_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnNavigateSQL.Click
Dim en As New SqlConnection _
("data source=localhost;initial catalog=pubs;user id=sa")
Dim da As New SqlDataAdapter("Select * from authors", cn)
Dim ds As New DataSet()
' Вставка в объект DataSet данных из реляционной базы данных
da.Fill(ds, "authors")
' Создание объекта XmlDataDocument на основе существующего
' объекта DataSet.
Dim xmlDoc As New Xml.XmlDataDocument(ds)
' Получение объекта-навигатора из XmlDataDocument.
Dim xmlNav As XPathNavigator = xmlDoc.CreateNavigator()
' Извлечение всех фамилий авторов из штата Калифорния (СА).
Dim xIterator As XPathNodeIterator xIterator = _
xmlNav.Select("//authors[state='CA']/au_lname")
' Последовательный обход всех выбранных узлов и
' отображение фамилий всех авторов.
Dim str As New System.Text.StringBuilder()
While (xIterator.MoveNext())
str.Append(xIterator.Current.Value & ControlChars.CrLf)
End While
MsgBox(str.ToString)
End Sub
Private Sub btnAddRows_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnAddRows.Click
Dim dsPubs As New DataSet()
' Считывание XML-данных из файла.
dsPubs.ReadXml("..\Pubs.xml")
' Вставка новой записи.
Dim row As DataRow = dsPubs.Tables("Publishers").NewRow()
row("pub_name") = "Newbie Publishing Corp."
row("city") = "New York"
row("state") = "NY"
row("Country") = "USA"
dsPubs.Tables("Publishers").Rows.Add(row)
' Связывание объекта DataSet с сеткой Data Grid
' для просмотра новых данных.
grdData.DataMember = "publishers"
grdData.DataSource = dsPubs
End Sub
Подпрограмма btnNavigateSQL_Click считывает данные из базы данных SQL Server, а затем выполняет обход всех записей, извлеченных с помощью XPATH-запроса. В этой подпрограмме ключевыми являются приведенные ниже строки.
Dim xmlDoc As New Xml.XmlDataDocument(ds)
' Получение объекта-навигатора из XmlDataDocument.
Dim xmlNav As XPathNavigator = xmlDoc.CreateNavigator()
' Извлечение всех фамилий авторов из штата Калифорния (CA).
Dim xIterator As XPathNodeIterator xIterator = _
xmlNav.Select("//authors[state='CA']/au_lname")
Сначала объект DataSet с данными связывается с новым объектом XmlDataDocument. Затем создается объект-навигатор XPathNavigator на основе объекта-документа XmlDataDocument. После чего на основе объекта XPathNavigator создается объект-итератор XPathNodeIterator. Далее строка XPATH-запроса передается методу Select для возвращения списка фамилий авторов (т.е. значений поля из Калифорнии (т.е. у которых поле state имеет значение СА). После этого выполняется последовательный обход всех узлов, извлеченных данным запросом, и создается строка с искомым перечнем авторов. Эта строка отображается в диалоговом окне, которое показано на рис. 10.3.
РИС. 10.3. Диалоговое окно с XML-данными, извлеченными из объекта DataSet
Вторая подпрограмма, btnAddRows_Clicks, выполняет другую задачу. Сначала она считывает XML-данные с помощью метода ReadXml из файла Pubs. в набор данных dsPubs, как показано в листинге 10.1. Этот метод автоматически создает таблицу publishers в объекте DataSet. Далее новые данные вставляются с помощью реляционных методов и объектов, например объекта-записи DataRow. Новый объект DataRow включается в схему таблицы publishers, а полям присваиваются указанные значения. После этого новая запись вставляется в таблицу publishers, а результат вставки отображается в сетке DataGrid (рис. 10.4).
Читать дальше