• Обзор XML
  • Семейство технологий XML
  • XML и доступ к данным 
  • Классы XML на платформе .NET
  • Применение модели Document Object Model
  • Применение технологии XPATH
  • Утилита SQLXML
  • Инсталляция и конфигурирование утилиты SQLXML
  • Результаты конфигурирования
  • Применение XML, XSLT и SQLXML для создания отчета
  • Резюме
  • Вопросы и ответы
  • ГЛАВА 9

    XML И .NET

    Вероятно, большинство читателей уже знакомы в той или иной мере с расширяемым языком разметки (extensible Markup Language — XML). По сути, пользователи встречаются с ним уже при установке среды Visual Studio .NET или CLR, даже если и не подозревают об этом. В свое время XML считался панацеей от всех бед, способной решить все проблемы обмена данными, независимо от используемой платформы или аппаратного обеспечения. На начальном этапе развития XML эти необоснованные ожидания породили массу избыточных и совершенно бесполезных затрат при создании приложений с применением XML. Разработчики стали повсюду использовать дескрипторы XML без учета их реальной необходимости для конкретных бизнес-ситуаций или технических причин. Мощь XML заключается в эффективном использовании метаданных и структурированных элементов для хранения данных. XML не является языком программирования, поскольку не содержит никаких директив для выполнения каких-либо действий, а потому обладает полной независимостью от используемой платформы.

    Разработчики, имеющие большой опыт работы с HTML, смогут легко понять преимущества надежного и эффективного использования XML. Пространство имен представлено элементом с префиксом xmlns:, оно содержит уникальное имя для контейнера, который предлагает функции и/или данные аналогично имени класса в языке Visual Basic. В среде Visual Basic .NET этот подход упрощается за счет использования расширенного набора классов для синтаксического анализа и манипулирования данными в формате XML. Рассмотрим обычный файл конфигурации web.config. Он имеет формат XML, а не "унаследованный" формат файла конфигурации.ini, хотя доступ к его данным можно осуществить с помощью аналогичных простых методов. Основное отличие заключается в том, что файл web.config обладает большими возможностями для расширения. Доказательством этого отличия является то, что управление файлом web.config осуществляется так же, как и любым другим документом в формате XML, хотя результаты подобных манипуляций могут быть совершенно иными.

    Основным преимуществом формата XML (и его аналогов, соответствующих протоколу Simple Object Access Protocol – SOAP) является его нейтральность. Благодаря этому всегда можно создать приложение с расширением логики путем расширения данных, а не создания уникального кода для доступа к централизованно хранящимся данным.

    В настоящей главе основное внимание сосредоточено на использовании XML в целях идентификации данных для приложений и пользователей. В ней описываются способы применения XML на платформе.NET в практических ситуациях. Более глубокое описание способов взаимодействия с базами данных и наборами данных DataSet с помощью классов модели ADO.NET приведено в главе 10, "ADO.NET и XML".

    В настоящее время описанию XML посвящено много книг и ресурсов. Поэтому вместо подробного рассмотрения этой темы основное внимание в этой главе уделяется вопросам интеграции XML с платформой .NET. Читатели, которые хорошо знакомы с основами XML, могут пропустить обзорные разделы вплоть до раздела с описанием классов XML для платформы .NET.

    Обзор XML

    Язык XML предназначен только для работы с данными. Точнее говоря, он предназначен для создания набора сведений, или метаданных, которые описывают данные. Рассмотрим приведенный ниже простой фрагмент кода на языке HTML.

    <form name="frmMain" action="mypage.aspx" method="POST">

    </form>

    Этот фрагмент содержит определение элемента form с атрибутами name, action и method. Атрибуты описывают отдельные элементы формы, сообщают Web-броузеру о выполняемых с ней действиях и являются простейшим примером метаданных. Обратите внимание на замыкающий дескриптор </form>, который обозначает конец контейнера элементов формы. В данном примере form – это универсальный контейнер с универсальными элементами. Экземпляр контейнера form образуется при размещении данных в его структуре.

    В приведенном ниже коде показан способ использования элементов и атрибутов XML для описания конкретного фрагмента данных. В нем создается профиль пользователя, который сохраняется в виде узла. Узел (или элемент) Person содержит атрибуты, которые описывают данного пользователя.

    <Person firstName="John" lastName="Doe" address1="123 Main Street" address2="" city="Sometown" state="OH" zip="22222" phone="111-242-5512" />

    Обратите внимание, что вся информация, независимо от конкретного пользователя, хранится в элементе Person. Любое приложение, которое может анализировать данные в формате XML (а это подвластно практически любому современному коммерческому приложению для работы с данными), способно извлечь из этого кода сведения о пользователе: имя, фамилию, адрес и номер телефона. Кроме того, поскольку с этим пользователем никакие другие данные не связаны, все сведения заканчиваются замыкающим дескриптором </Person>. В формате XML к синтаксису предъявляются очень строгие требования, например если не указать замыкающий дескриптор или пропустить какой-то элемент, то чтение всего документа может закончиться неудачей.

    НА ЗАМЕТКУ

    Семантика XML интересна тем, что на элемент можно ссылаться как на узел и наоборот. В некоторых публикациях элемент также называют дескриптором. Во избежание путаницы здесь и далее используются только термины "элемент" и"узел". 

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

    Листинг 9.1. Пример элемента Person с подчиненными элементами

    <Person firstName="John">

     lastName = "Doe"

     address1 = "123 Main Street"

     address2 = ""

     city = "Sometown"

     state = "ОН"

     zip = "22222"

     phone = "111-242=5512"

     <orders>

      <order id="111" itemid="2932" itemdesc="Super Foo Widget"></order>

     </orders>

    </Person>

    Как видите, элемент Person здесь нужно закрыть явно, потому что изменился диапазон контейнера, т.е. теперь он содержит сведения о заказах orders. Приведенный в листинге 9.1 код является нейтральным, т.е. не содержит никакой информации о приложении, только данные и метаданные.

    НА ЗАМЕТКУ

    Языку XML посвящено множество материалов, опубликованных в печатных изданиях и в Internet. Прекрасное введение в XML можно найти по адресу: http://www/w3.org/XML/1999/XML-in-10-points.html. Вот несколько других адресов Web-узлов, которые содержат наиболее полные сведения по этой теме:

    • Web-узел консорциума World Wide Web Consortium http://www/w3.org) содержит официальные и хорошо документированные спецификации XML;

    • Web-узел компании Microsoft (http://msdn.microsoft.com) содержит постоянно обновляемые ресурсы, которые охватывают все вопросы использования XML и родственных технологий с программными продуктами Microsoft;

    • Web-узел компании TopXML/VBXML.com (http://www.vbxml.com) предлагает разные ресурсы и примеры кодов для работы с технологией XML.

    Семейство технологий XML

    Язык XML не одинок и сосуществует с несколькими другими родственными технологиями.

    • XML Path Language (XPATH) предлагает способ извлечения информации из XML-документа. Хотя синтаксис XPATH радикально отличается от синтаксиса XML, он работает аналогично SQL-запросам.

    • Extensible StyleSheet Language Transformations (XSLT) предлагает способ преобразования (т.е. вставки, удаления или изменения) данных XML-документа в данные, которые могут использоваться в другом XML-документе. XSLT может использовать технологию XPATH для извлечения преобразуемых данных.

    • Extensible StyleSheet Language (XSL) — это XSLT плюс объекты, которые позволяют разработчику описывать способ отображения информации в броузере или другом XSL-совместимом приложении.

    • Document Object Model (DOM) содержит стандартный набор функций, которые позволяют программными средствами извлекать данные из XML- или HTML-документа.

    • Simple Object Access Protocol (SOAP) – это спецификация вызовов Web-служб или других Web-ориентированных приложений и служб, а также форматирования отклика. Более подробно SOAP рассматривается в главе 12, "Web-службы и технологии промежуточного уровня".

    РИС. 9.1. Иерархия технологий XML, XSL, XSLT u XPATH


    На рис. 9.1 показана взаимосвязь между технологиями XML, XSL, XSLT и XPATH в приложении на основе XML. (Более подробно такие приложения рассматриваются далее, в разделе о классах XML на платформе .NET.) Обратите внимание, что XML-документ является источником данных, т.е. содержит отображаемые в приложении данные. XPATH-запрос элементов People/Person используется для сбора сведений обо всех элементах Person из XML-документа. XSL-стиль окружает данные элементами с указанием шрифта с помощью XSL-страницы стиля. После анализа и обработки полученный результат возвращается в формате HTML.

    ВНИМАНИЕ!

    Учтите, что XML имеет очень строгие правила, причем все имена нужно приводить с учетом регистра символов.

    Для демонстрации этой взаимосвязи вставьте код из листингов 9.2 и 9.3 в файлы simple.xml и simple.xsl, которые располагаются в одном каталоге. Откройте файл simple.xml в Web-броузере Internet Explorer версии 6.0 или выше. Результат выполнения этих действий будет иметь вид, представленный на рис. 9.1.

    ЛИСТИНГ 9.2. Файл simple.xml

    <?xml version='1.0'?>

    <?xml:stylesheet type="text/xsl" href="simple.xsl"?>

    <People>

     <Person>

      John Doe

     </Person>

     <Person>

      Jane Doe

     </Person>

    </People>

    Обратите внимание, что страница стиля связана с XML-документом. С помощью .NET-классов для XML или MSXML-анализатора Visual Basic можно динамически изменять результаты с представлением их в нескольких разных форматах (например, WML).

    ЛИСТИНГ 9.3. Файл simple.xsl

    <?xml version="1.0"?>

    <HTML xmlns:xsl="http://www.w3.org/TR/WD-xsl">

     <xsl:for-each select="People/Person">

      <font face="Arial">

       <xsl:value-of select="."/>

      </font>

     </xsl:for-each>

    </HTML>

    Строка select="People/Person" — это XPATH-запрос, который представляет собой эквивалент SQL-команды SELECT People FROM Person. Для циклического обхода всех элементов применяется команда xsl:for-each из спецификации XSL. В отличие от XML, в котором нет программных директив, в XSL предусмотрен целый набор директив, который может быть расширен благодаря сценариям для предоставления дополнительной функциональности.

    XML и доступ к данным 

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

    Когда создатели платформы .NET планировали следующую версию интегрированной среды разработки, такая гибкость была одним из основных требований. Теперь практически все элементы платформы .NET используют XML для обмена информацией. Среда CLR использует XML-файлы для указания параметров приложения. Объекты DataSet возвращаются как XML-документы, которые могут записываться в виде строки или документа. XML Web-службы удовлетворяют открытому стандарту SOAP, который в конечном итоге означает, что код объекта для платформы Windows может быть расширен для использования на любой другой платформе, которая поддерживает HTTP- или SOAP-запросы.

    XML не предлагает никаких новых революционных способов изменения способов доступа к данным, а лишь иначе использует известные способы сбора и сохранения данных. Более подробная информация о применении компонентов XML с моделью ADO.NET предлагается в главе 10, "ADO.NET и XML".

    Классы XML на платформе .NET

    На платформе .NET язык XML применяется для повышения производительности, совместимости с открытыми стандартами и интеграции с ADO.NET. Для этого предусмотрены специализированные классы и пространства имен. Для перечисления всех имеющихся пространств имен, классов, методов, свойств, перечислений, интерфейсов и делегатов потребовалось бы привести огромную таблицу, что в целом было бы крайне неэффективным способом расходования пространства и времени. Вместо этого здесь и далее описывается несколько основных классов платформы .NET Framework, предназначенных для работы с XML. На основе этих классов далее приводится несколько примеров эффективного использования XML с иллюстрацией причин, по которым разработчики платформы .NET Framework из компании Microsoft создали их именно такими.

    В этом разделе приводятся примеры выполнения задач, связанных с созданием приложений для XML, XSL, XSLT и XPATH. (В замечании из предыдущего раздела приводятся ссылки на некоторые ресурсы с более подробным описанием этих технологий.) Как уже отмечалось, основная цель XML заключается в структурировании и описании данных. Для этого на платформе .NET Framework предусмотрены классы пространства имен System.xml. В приведенных далее примерах используются некоторые другие новые компоненты Visual Basic .NET, которые подробно комментируются.

    Применение модели Document Object Model

    С появлением модели Document Object Model (DOM) значительно упростилось создание динамически генерируемых Web-узлов, благодаря приданию дополнительных функциональных возможностей статическим элементами в документах HTML/XML. Простая строка кода document.location сценария JavaScript выполняет обход всех элементов Web-страницы, начиная с самого верха объекта document и заканчивая поиском свойства location. Этот способ программируемого доступа к объектам Web-страницы был в определенной степени революционным. Затем появился XML со строгими правилами и динамической объектной моделью, на основе которой автор документа определял корневой или родительский элемент.

    В примерах оставшейся части главы с помощью утилиты SQLXML создается XML-документ с именем simple2.xml. Ручное кодирование больших HTML-страниц — это довольно скучное и утомительное занятие, при котором нужно тщательно следить за форматом всех данных. Однако XML обладает несомненным достоинством: нет необходимости беспокоиться о том, что в документ попадет какая-то дополнительная ненужная информация, как это обычно бывает при создании Web-страниц с помощью некоторых HTML-редакторов.

    В листинге 9.4 приведен текст простого XML-документа simple2.xml. Расположение символов конца строки на самом деле не имеет никакого значения, потому что аналогично другим языкам программирования XML использует специализированные символы для обозначения строк. Например, в С++, Java и JavaScript для разделения строк используется точка с запятой, а в XML единой строкой считаются все символы между открывающим < и закрывающим дескрипторами.

    ЛИСТИНГ 9.4. Файл simple2.xsl

    <?xml version="1.0" encoding="utf-8?>

    <customer>

     <tblCustomer ID="1" FirstName="Carole" LastName="Vermeren"Address="6227 East Crossing Drive" City="Ocean Glen" State="NH" PostalCode="98609" Phone="6034485994" />

     <tblCustomer ID="2" FirstName="Cathy" LastName="Johnson" Address="West River Street" City= "Big Center" State="NC" PostalCode="18602" Phone="9193669205" />

     <tblCustomer ID="3" FirstName="Eric" LastName="Haglund" Address="9193 West Beach Street" City="Brown Heights" State="OK" PostalCode="83481" Phone="4059310689" />

     <tblCustomer id="4" FirstName="Julie" LastName="Ryan" Address="9161 Fort Beach Way" City="South Point" State="KY" PostalCode="26973" Phone="5025245220" />

     <tblCustomer ID="5" FirstName="Richard" LastName="Halpin" Address="9760 Happy River Street" City="North Lake" State="MN" PostalCode="62875" Phone="6124066311" />

     <tblCustomer ID="6" FirstName="Kathleen" LastName="Johnson" Address="9385 West Heights Street" City="Brown Towne" State="MI" PostalCode="59609" Phone="3138032214" />

     <tblCustomer ID="7" FirstName="Sorel" LastName="Polito" Address="2104 Brown Brook Drive" City="Blue Valley" State="MT" PostalCode="54401" Phone="4067260212" />

     <tblCustomer ID="8" FirstName="Sorel" LastName="Terman" Address="1920 West Point Street" City="Blue Bluffs" State="WI" PostalCode="08965" Phone="6086246867" />

     <tblCustomer ID="9" FirstName="Randy" LastName="Hobaica" Address="4619 North Plains Drive" City="Brown Ridge" State="CT" PostalCode="09793" Phone="2039421728" />

     <tblCustomer ID="10" FirstName="Mattew" LastName="Haglund" Address="9725 Sunset Crossing Avenue" City="New Brook" State="AR" PostalCode="79013" Phone="5014589191" />

    </customer>

    Информация в листинге 9.4 взята из базы данных Novelty, описанной в главах 1-3, с помощью приведенного ниже запроса.

    SELECT ТОР 10 * FROM tblCustomer FOR XML AUTO

    Затем в него вручную добавлен элемент <customer>. Далее, в разделе об утилите SQLXML, показано, как для любого XML-документа автоматически создается корневой элемент.

    В следующем примере рассматривается класс XMLDocument, с помощью которого осуществляется доступ к XML-данным и документам на платформе .NET Framework. В простейшем случае XML-данные из документа или строки в оперативной памяти загружаются с помощью метода Load класса XMLDocument.

    Применение технологии XPATH

    Что происходит после загрузки XML-документа? В пространстве имен System.xml предусмотрены классы xmlNode и xmlNodeList. С помощью этих классов и технологии XPATH происходит считывание XML-документа и извлечение интересующих нас данных. В листинге 9.5 показано простое приложение Visual Basic .NET, которое загружает XML-документ из файла simple2.xsl и выводит все имена (атрибут FirstName) в текстовом поле.

    ЛИСТИНГ 9.5. Пример использования классов XmlDocument И XmlNode

    Imports System.Xml

    Imports System.Xml.XPath

    Imports System.IO


    Public Class Form1

     Inherits System.Windows.Forms.Form

    ' Здесь опущен код, сгенерированный Windows Form Designer.

     Private Sub Form1_Load(ByVal sender As System.Object, _

      ByVal e As System.EventArgs) Handles MyBase.Load

      Dim xDoc As New XmlDocument()

      xDoc.Load("simple2.xml")

      ' Обратите внимание, что для получения значения

      ' атрибута используется синтаксис XPATH.

      Dim xNodeList As XmlNodeList = _

       xDoc.SelectNodes("descendant::tblCustomer/@FirstName")

      Dim xNode As XmlNode

      Dim i As Integer = 0

      For Each xNode In xNodeList

       lstResults.Items.Insert(i, xNode.InnerText)

       i = i + 1 Next

      End Sub

    End Class

    Для выполнения этого кода создайте новый проект, форму, а в форме — поле со списком lstResults. Поместите код подпрограммы Form1_Load из листинга 9.5 в код формы. После компоновки и запуска приложения в поле со списком будут показаны результаты, показанные на рис. 9.2 (при условии, что в каталоге выполняемого файла находится файл simple2.xml).  

    РИС. 9.2. Результаты выполнения кода из листинга 9.5


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

    НА ЗАМЕТКУ

    Далее код подпрограммы Form1_Load из листинга 9.5 переносится в код подпрограммы showTоp10 (листинг 9.6).

    В листинге 9.6 приведен измененный код данного примера, в котором можно изменять и сохранять значение каждого узла в XML-документе. В этом достаточно простом примере используются чрезвычайно эффективные и надежные средства изменения XML-документа. Помимо упомянутых выше изменений, в данное приложение также включены кнопки btnShowTop10 и btnChangeAndSave для вызова отдельных подпрограмм отображения и изменения данных. После создания новых кнопок, компоновки проекта и запуска приложения щелкните на кнопке ShowTop10. После выполнения этих действий в поле со списком будут представлены результаты, показанные на рис. 9.2. (Учтите: это возможно лишь при условии, что в каталоге выполняемого файла находится файл simple2.xml.) Для редактирования одного из значений щелкните дважды на том элементе списка, который нужно изменить. Затем в диалоговом окне ChangeAndSave введите новое имя и щелкните на кнопке OK. После этого в поле со списком будет отображено обновленное состояние XML-документа с измененными значениями списка.

    ЛИСТИНГ 9.6. Код приложения XMLDomSample

    Imports System.Xml

    Imports System.Xml.XPath

    Imports System.IO


    Public Class Form1

     Inherits System.Windows.Forms.Form

     …

     ' Здесь опущен код, сгенерированный Windows Form Designer.

     …

     Private Sub Form1_Load(ByVal sender As System.Object, _

      ByVal e As System.EventArgs) Handles MyBase.Load


     End Sub


    Private Sub ShowTop10()

      Dim xDoc As New XmlDocument()

      xDoc.Load("simple2.xml")

      ' Обратите внимание, что для получения значения атрибута

      ' используется синтаксис XPATH.

      Dim xNodeList As XmlNodeList = _

       xDoc.SelectNodes("descendant::tblCustomer/@FirstName")

      Dim xNode As XmlNode

      Dim i As Integer = 0

      For Each xNode In xNodeList

       lstResults.Items.Insert(i, xNode.InnerText)

       i = i + 1

      Next

     End Sub


     Public Sub ChangeNameandSave(ByVal NameToChange As String, ByVal ChangeTo _

      As String)

      Dim xDoc As New XmlDocument()

      xDoc.Load("simple2.xml")

      Dim xNodeList As XmlNodeList = _

       xDoc.SelectNodes("descendant::tblCustomer/@FirstName")

      Dim xNode As XmlNode

      For Each xNode In xNodeList

       If xNode.InnerText = NameToChange Then

        xNode.Value = ChangeTo

       End If

      Next

      xDoc.Save("simple2.xml")

      MsgBox("Name change saved!", 0)

      lstResults.Items.Clear()

      ShowTop10()

     End Sub


     Private Sub btnShowTop10_Click(ByVal sender As System.Object, _

      ByVal e As System.EventArgs) Handles btnShowTop10.Click

      ShowTop10()

     End Sub


     Private Sub lstResults_DoubleClick(ByVal sender As Object, _

      ByVal e As System.EventArgs) Handles lstResults.Doubleclick

      Dim oldName As String = _

       lstResults.GetItemText(lstResults.Items.Item(lstResults.SelectedIndex))

      Dim newName As String = _

       InputBox("Please enter a new name", "ChangeAndSave")

      ChangeNameandSave(oldName, newName)

     End Sub

    End Class

    НА ЗАМЕТКУ

    уже сообщалось ранее, коды всех примеров можно найти на Web-странице Издательского дома "Вильяме" адресу: http://www.williamspublishing.com.

    Утилита SQLXML

    Утилита SQLXML версии 3.0 представляет собой еще один способ сбора и генерации XML-документов. Она не может заменить средства ADO.NET, а является лишь расширением функций SQL Server с помощью интерфейса броузера для создания отчетов, отслеживания выполняемых действий и т.п.

    Для использования утилиты SQLXML необходимо инсталлировать Web-сервер Internet Information Server (IIS) и СУБД SQL Server 2000, в состав которой и входит эта утилита. В данном примере используется компьютер с операционной системой Windows XP Professional, IIS 5.1 и утилита SQLXML версии 3.0.

    Утилита SQLXML расширяет функции СУБД SQL Server 2000 возможностями создания запросов к базе данных на основе HTTP-запросов. Хотя она обладает многими преимуществами, некоторые опасения у разработчиков вызывают вопросы обеспечения безопасности. Большинство этих опасений можно устранить за счет использования системы аутентификации Windows для виртуальных каталогов, в которых выполняются запросы, и для базы данных.

    НА ЗАМЕТКУ

    Утилиту SQLXML версии 3.0 можно бесплатно скопировать с Web-узла компании Microsoft ПО адресу: http://msdn.microsoft.com/downloads/default.asp?url=/downloads/sample.asp?url=/msdn-files/027/001/824/msdncompositedoc.xml.

    Инсталляция и конфигурирование утилиты SQLXML

    После копирования файла с утилитой SQLXML с Web-узла компании Microsoft щелкните дважды кнопкой мыши на нем. На экране появится программа-инсталлятор с несколькими стандартными вопросами, например: согласны ли вы с предлагаемой лицензией и хотите ли вы выполнить обычную или специализированную инсталляцию? Единственное отличие между типами инсталляции заключается в том, что в специализированной инсталляции можно указать другой каталог размещения файлов утилиты.

    Для конфигурирования утилиты SQLXML выполните следующее. Выберите команду Start→Microsoft SQL Server→Configure SQL XML Support in IIS (Пycк→Microsoft SQL Server→Конфигурировать поддержку SQL XML в IIS), на экране появится диалоговое окно IIS Virtual Directory Management for SQL Server (Виртуальный каталог управления IIS для SQL Server) программы Microsoft Management Console (рис. 9.3). 

    РИС. 9.З. Диалоговое окно IIS Virtual Directory Management for SQL Server программы Microsoft Management Console


    Обратите внимание на то, что панель в правой части окна содержит только один столбец Computer. Щелкните дважды левой кнопкой мыши на имени компьютера в этом столбце для раскрытия списка всех Web-узлов данного компьютера, как показано на рис. 9.4. Обратите внимание: имя текущего столбца в правой части окна изменилось и он стал называться Web Site Name (Имя Web-узла).

    РИС. 9.4. Список Web-узлов


    Щелкните дважды на надписи Default Web Site (Используемый по умолчанию Web-узел), которая показана на рис. 9.5, для отображения списка конфигурированных виртуальных каталогов в правой части окна.

    РИС. 9.5. Используемый по умолчанию Web-узел


    Далее создайте новый каталог c:\inetpub\wwwroot\novelty. Для этого выберите команду Start→Run, введите команду cmd, щелкните на кнопке OK, введите в режиме командной строки команду mkdir с:\inetpub\wwwroot\novelty и нажмите клавишу <Enter>. Аналогично внутри этого каталога создайте подкаталог Templates.

    Для конфигурирования нового виртуального каталога щелкните правой кнопкой мыши на узле Default Web Site в левой части окна и выберите в контекстном меню команду New→Virtual Directory (Создать→Виртуальный каталог), как показано на рис. 9.6.

    Рис. 9.6. Выбор команды New→VirtualDirectory


    После выбора виртуального каталога на экране появится новое диалоговое окно New Virtual Directory Properties (Свойства нового виртуального каталога) с шестью вкладками. В первой вкладке, General, предлагается ввести имя виртуального каталога, а также путь к локальному каталогу, где располагаются файлы. Введите в текстовом поле Virtual Directory Name (Имя виртуального каталога) имя Novelty, а в текстовом поле Local Path (Локальный путь) укажите путь к локальному каталогу с:\inetpub\wwwroot\novelty, как показано на рис. 9.7.

    РИС. 9.7. Указание имени виртуального каталога и пути к нему


    Далее щелкните на вкладке Security (Безопасность) в верхней части диалогового окна и выберите переключатель Use Windows Integrated Authentication (Использовать интегрированную систему аутентификации Windows). На этом этапе предполагается, что при установке SQL Server был выбран смешанный режим аутентификации Mixed-Mode Authentication или режим аутентификации Windows Authentication. Выбор каждого из этих режимов определяется предпочтительным уровнем безопасности. Если безопасность не имеет существенного значения, например СУБД не связана с внешней сетью, то в таком случае подойдет первый режим. Он позволяет кэшировать параметры подключения аналогично строке подключения. Третий режим, HTTP-Based Basic Authentication (Аутентификация на основе HTTP), базируется на учетной записи SQL Server. На рис. 9.8 показан выбор режима аутентификации Windows Authentication.

    Выберите вкладку Data Source (Источник данных) и укажите используемый экземпляр СУБД SQL Server и базу данных. В текстовом поле SQL Server оставьте предлагаемое по умолчанию имя (local). 

    РИС. 9.8. Параметры системы обеспечения безопасности


    НА ЗАМЕТКУ

    Имя (local) является "дружественным" именем сервера, который запущен на локальном компьютере. Если SQL Server сконфигурирован для репликации данных в качестве подписчика или издателя данных, то вместо дружественного имени нужно указать фактическое имя компьютера.

    Далее в поле со списком Database (База данных) выберите базу данных Novelty, как показано на рис. 9.9. Учтите, что в нем перечислены те базы данных, которые соответствуют параметрам подключения и режиму безопасности.

    Выберите вкладку Settings (Параметры) и установите флажки параметров Allow URL queries (Разрешить запросы в URL-указателях), Allow template queries (Разрешить запросы из шаблонов) и Allow XPath (Разрешить Xpath-запросы), как показано на рис. 9.10.

    Наконец, выберите вкладку Virtual Names (Виртуальные имена). Щелкните на кнопке New в области окна Defined virtual names (Заданные виртуальные имена). В текстовом поле Virtual Name (Виртуальное имя) диалогового окна Virtual Name Configuration (Конфигурация виртуального имени) введите имя templates. В поле со списком Туре (Тип) выберите тип Template (Шаблон), а в текстовом поле введите c:\inetpub\wwwroot\novelty\templates, как показано на рис. 9.11. Для сохранения указанных параметров щелкните на кнопке Save.


    РИС. 9.9. Параметры источника данных

    РИС. 9.10. Вкладка Settings 

    РИС. 9.11. Диалоговое окно Virtual Name Configuration


    После этого диалоговое окно New Virtual Directory Properties будет иметь вид, показанный на рис. 9.12. Щелкните на кнопке OK для его закрытия.

    Таким образом, успешно сконфигурирован виртуальный каталог с помощью IIS. Теперь можно корректно выполнять SQL-запросы к базе данных SQL Server. Если дважды щелкнуть на узле Default Web Site в левой части диалогового окна IIS Virtual Directory Management for SQL Server программы Microsoft Management Console, то его правая часть будет иметь такой вид, как на рис. 9.13. Закройте диалоговое окно IIS Virtual Directory Management for SQL Server. 

    Рис. 9.12. Диалоговое окно New Virtual Directory Properties после конфигурирования виртуального каталога

    Рис. 9.13. Диалоговое окно IIS Virtual Directory Management for SQL Server программы Microsoft Management Console после конфигурирования параметров Web-узла Novelty

    Результаты конфигурирования

    Рассмотрим теперь, что же получилось в результате конфигурирования параметров Web-узла Novelty. Откройте Web-броузер Internet Explorer версии 6.0 или выше. Полученный результат будет выглядеть, как показано в листинге 9.4. Файл simple2.xml был создан именно так. Введите приведенный ниже URL-указатель для просмотра структуры файла.

    http://localhost/Novelty?sql=select top 10 * from tblCustomer FOR XML AUTO&root=customer

    Обратите внимание, что параметр root в конце данного URL-указателя содержит корневой элемент XML-документа. Без него довольно трудно отображать результаты HTTP-запросов в окне Web-броузера.

    Применение XML, XSLT и SQLXML для создания отчета

    Попробуем теперь применить описанные ранее сведения в практической ситуации, например для создания списка адресов клиентов. Как будет показано далее, изменение HTML-содержимого с помощью XSL-файла не вызывает больших трудностей. Поэтому такой способ часто применяется для форматирования страниц, которые предполагается распечатать, или вместе с JavaScript/ASP.NET для повышения функциональности и надежности.

    SQL Server предоставляет данные в формате XML, а для сохранения запроса используется шаблон в файле noveltytemplate.xml. Единственным назначением этого файла является сбор данных и присвоение страницы стиля.

    <?xml version =1.0' encoding='UTF-8 '?>

    <root xmlns:sql='urn:schemas-microsoft-com:xml-sql' sql:xsl='noveltyxsl.xsl' >

     <sql:query>

      SELECT FirstName, LastName, Address, City, State FROM tblCustomer FOR XML AUTO

     </sql:query>

    </root>

    В первой строке задается базовый XML-документ и способ связывания со страницей стиля, который аналогичен применению элемента xml:stylesheet в листинге 9.2. Следующий элемент sql:query является контейнером команды SQL или выполняемого запроса. Предложение FOR XML AUTO сообщает SQL Server о возвращении результатов в формате XML. В шаблоне предполагается, что корневой элемент называется root, поэтому его не нужно указывать в шаблоне запроса.

    НА ЗАМЕТКУ

    Для динамического присвоения страницы стиля с помощью SQLXML нужно добавить в URL-указатель параметр запроса xsl= и указать используемый файл в формате http://имя_компьютера/виртуальный_каталог_шаблонов/имя_шаблона.xml?xsl=имя файла_стиля.xsl.

     В листинге 9.7 показана страница стиля XSL, которая используется для создания итогового XML-документа. Для указания атрибута в ней применяется технология XPATH. С помощью синтаксиса CSS и HTML создается формат представления извлеченной информации в окне Web-броузера.

    ЛИСТИНГ 9.7. Файл noveltyxsl.xsl

    <?xml version='1.0' encoding='UTF-8'?>

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

     <xsl:template match = '*'>

      <xsl:apply-templates />

     </xsl:template>

     <!-- Имя запрашиваемой таблицы извлекается из дочерних элементов. -->

     <xsl:template match = 'tblCustomer'>

      <TR>

       <!-- Обратите внимание на использование XPATH для сбора данных из полей. -->

       <TD><xsl:value-of select='@FirstName' /></TD>

       <TD><xsl:value-of select='@LastName' /></TD>

       <TD><xsl:value-of select='@Address' /></TD>

       <TD><xsl:value-of select='@City' /></TD>

       <TD><xsl:value-of select='@State' /></TD>

      </TR>

     </xsl:template>

     <xsl:template match = '/'>

      <HTML>

       <HEAD>

        <STYLE>th {background-color: #000080; color: #ffffff;} td {font-family: Arial} </STYLE>

       </HEAD>

       <BODY>

        <TABLE border='1' style='width:600;'>

         <TR><TH colspan='9' >Customers</TH></TR>

         <TR>

          <TH>First name</TH>

          <TH>Last name</TH>

          <TH>Address</TH>

          <TH>City</TH>

          <TH>State</TH>

         </TR>

         <xsl:apply-templates select = 'root' />

         </TABLE>

        </BODY>

       </HTML>

      </xsl:template>

    </xsl:stylesheet>

    Разместите оба файла (noveltytemplate.xml и noveltyxsl.xsl) в подчиненном каталоге templates виртуального Web-каталога Novelty, который описывается в предыдущем разделе. После этого откройте Web-броузер Internet Explorer версии 6.0 или выше и введите в нем следующий URL-указатель:

    http://localhost/Novelty/templates/noveltytemplate.xml?contenttype=text/html

     Параметр contenttype используется для указания формата представления конечного результата, т.е. в виде HTML-страницы. После выполнения описанных действий данные в окне Web-броузера будут иметь такой вид, как на рис. 9.14.

    РИС. 9.14. Результат представления данных с помощью XML-шаблона и технологии XSL

    Резюме

    В этой главе представлены базовые сведения о языке XML и его назначении. Здесь демонстрируются способы применения XML на платформе.NET Framework и взаимодействия XML с Visual Basic.NET. В конце главы показан способ конфигурирования Web-сервера IIS и СУБД SQL Server 2000 для представления информации в виде XML-документов, на основе которых можно легко создавать HTML-страницы. Большая часть приведенной здесь информации играет роль введения в главу 10, "ADO.NET и XML".

    Вопросы и ответы

    Что означает "создание схемы" в контексте XML?

    В контексте баз данных "создание схемы" означает создание документа с определениями объектов и сущностей. В контексте XML это понятие может быть расширено и охватывать другие сведения, например определение поля без неопределенных значений (NOT NULL) в таблице базы данных.

    Что произойдет, если для названия элемента в XML-документе использовать уже зарезервированное имя HTML-элемента, например title?

    Для устранения такой двусмысленности и предназначены пространства имен. Можно создать XML-документ с применением XSLT и использовать в нем уже зарезервированное имя HTML-элемента, например title, для одного из полей таблицы. Именно для этого придется использовать собственное пространство имен.

    С помощью строки кода <xmlns:b=http://myMachine.com> можно теперь использовать префикс b: для любого XML-элемента, даже если его имя совпадает с каким-то уже зарезервированным именем HTML-элемента.

    В таком случае строки <b:title> и <title> будут относиться к совершенно разным сущностям. Единственным строгим условием является предварительное объявление используемого пространства имен, например в самом начале документа.








    Главная | В избранное | Наш E-MAIL | Прислать материал | Нашёл ошибку | Наверх