Получение XML-данных с помощью XmlDataSource в ASP.NET 2.0
ОГЛАВЛЕНИЕ
Основы XmlDataSource
Элемент управления XmlDataSource является посредником для получения XML-данных, к которым потом может быть осуществлен доступ программным путем, либо они могут быть привязаны к элементу управления. Для осуществления доступа к XML-данным с ASP.NET-страницы посредством элемента XmlDataSource, начните с перетаскивания элемента из Toolbox в окно дизайнера (Designer) (элемент XmlDataSource расположен в разделе данных (Data) в Toolbox). Из смарт-тега элемента XmlDataSource, нажмите на ссылку настройки источника данных ( "Configure Data Source") для открытия мастера настройки (Configure Data Source wizard), показанного ниже. Находясь в мастере, вы можете установить три самых полезных свойства элемента XmlDataSource:
- DataFile - указывает файл, содержащий XML-данные, к которым будет осуществлен доступ. Это может быть локальный файл ~/App_Data/XMLFile.xml, либо удаленный файл, к примеру http://msdn.microsoft.com/rss.xml.
- TransformFile - XML-документы могут быть преобразованы из одной структуры в другую посредством языка разметки известного как XSL Transformations, или XSLT. Если вы хотите преобразовать содержимое XML в DataFile до работы с XML-данными, укажите XSLT-файл для произведения преобразования. Для получения более подробной информации об XSLT прочитайте учебник по XSLT на сайте W3 Schools.
- XPath - XPath является XML-синтаксисом, используемым для фильтрации содержимого XML-документа, возвращая конкретное значение либо набор узлов. Если вы хотите работать с конкретным набором XML-данных, укажите выражение XPath для ограничения результатов. Читайте учебник по XPath на сайте W3 School для получения большей информации.
Если у вас нет XML-данных или XSLT сохраненных в файле, вы можете указать необработанный XML или XSLT напрямую из свойств Data и Transform элемента XmlDataSource. Данные свойства невозможно установить посредством мастера настройки источника данных (Configure Data Source), но вместо этого могут быть установлены через окно свойств Properties. (нажмите на элемент XmlDataSource в режиме дизайнера (Designer) и затем нажмите F4.)
Привязка элемента управления XmlDataSource к элементу управления данными и осуществление доступа к XML-данным
Как только вы настроите элемент управления XmlDataSource, добавьте элемент управления данными на страницу и установите его свойство DataSourceID в ID элемента управления XmlDataSource (это легко можно выполнить используя выпадающий список в смарт-теге элемента управления). ASP.NET 2.0 предоставляет новые методы привязки данных для осуществления доступа к конкретным значениям либо набору узлов из привязки данных XML к элементу управления данными:
- XPath("xpath") - осуществляет доступ к конкретному значению. Для того, чтобы получить следующее значение узла просто сошлитесь на узел в xpath; для атрибута поставьте вначале имени @.
- XPathSelect("xpath") - возвращает набор узлов; может быть использована для привязки набора узлов ко вложенному элементу управления данными.
Пример 1: Отображение RSS 2.0 ленты в DataList
RSS (Really Simple Syndication), это XML-формат разработанный для того, чтобы позволить веб-сайтам публиковать свое содержимое. Содержимое может быть с легкостью интегрировано в другие веб-сайты, либо может быть просмотрено кем-то посредством набора настольных приложений. Многие сайты на сегодняшний день используют RSS 2.0 ленту.
RSS-лента может иметь следующий формат:
<rss version="2.0">
<channel>
<title>News by Scott</title>
<link>http://www.example.com</link>
<description>Hear the news from Scott.</description>
<item>
<title>Exercise to Stay Fit</title>
<link>http://www.example.com/news.aspx?Id=4</link>
<description>
Doctors are currently studying whether exercise improves
physical fitness. The results are expected in 2009.
</description>
<pubDate>Wed, 20 Sep 2006 03:15:00 GMT</pubDate>
</item>
<item>
<title>(Still) War in the Middle East</title>
<link>http://www.example.com/news.aspx?Id=2</link>
<description>
Historians remain baffled that turmoil in the Middle East
still reigns. Is it time for both sides to shake hands
and make up?
</description>
<pubDate>Tue, 19 Sep 2006 06:31:15 GMT</pubDate>
</item>
...
</channel>
</rss>
Вкратце, RSS-лента составлена из набора элементов <item>, каждый из которых представляет последнюю опубликованную часть содержимого.
Для данного примера нам необходимо привязать набор элементов содержимого к DataList. Таким образом, установите свойство DataFile элемента управления XmlDataSource в указатель ресурса источника удаленной RSS 2.0 ленты (к примеру, http://aspnet.4guysfromrolla.com/rss/rss.aspx) и свойство XPath в /rss/channel/item. Данное выражение XPath указывает XmlDataSource на то, чтобы оно вернуло набор элементов <item>, что означает, что DataList-привязка к данному XmlDataSource будет иметь одну запись, созданную для каждого элемента <item> в указанной ленте RSS.
Далее добавьте DataList и настройте его ItemTemplate на отображение элементов <title>, <description> и <pubDate><link>). Следующая разметка выполняет это: каждого элемента содержимого, также с ссылкой для чтения содержимого (при помощи значения элемента
<asp:DataList ID="FeedList" runat="server" DataSourceID="RSSFeedDataSource">
<ItemTemplate>
<h4>
<a href='<%# XPath("link") %>'>
<asp:Label runat="server" ID="TitleLabel" Text='<%# XPath("title") %>'></asp:Label>
</a>
</h4>
<p>
<i>Published <%#XPath("pubDate")%></i>
</p>
<p>
<asp:Label runat="server" ID="DescriptionLabel" Text='<%# XPath("description") %>'></asp:Label>
</p>
<p>
[<a href='<%# XPath("link") %>'>Read More</a>]
</p>
<br />
</ItemTemplate>
</asp:DataList>
Заметьте как используется синтаксис <# XPath("xpath") %> для получения конкретного значения из текущего узла привязанного к DataList. Поскольку DataList привязан к набору узлов <item>, <%# XPath("link") %> возвратит значение текущего элемента <link> узла <item>.
После указания ItemTemplate, просмотрите страницу в обозревателе. Следующее изображение показывает результат RSS ленты.

Пример 2: Привязываем набор узлов ко вложенному элементу управления данными
Метод XPath("xpath") позволяет нам привязать конкретное значение из текущего XML-узла, но если нам нужно получить полный набор узлов и привязать его ко вложенному элементу управления, то метод XPathSelect("xpath") предоставляет данную функциональность. Для того, чтобы продемонстрировать данный метод в использовании мы создали пример, который отображает квитанцию покупки пользователя, где детальная информация покупки отображена в XML-формате. В приложении к данной статье вы найдете файл названный PO.xml в каталоге проекта App_Data. Данный XML-файл содержит информацию об одном заказе, и имеет следующую структуру:
<Order orderDate="orderDate">
<Customer>
<Name>name</Name>
<Cardnum>credit card number</Cardnum>
</Customer>
<Manifest>
<Item>
<ID>ID</ID>
<Title>title</Title>
<Quantity>qty</Quantity>
<UnitPrice>price</UnitPrice>
</Item>
<Item>
<ID>ID</ID>
<Title>title</Title>
<Quantity>qty</Quantity>
<UnitPrice>price</UnitPrice>
</Item>
...
</Manifest>
<Receipt>
<Subtotal>subtotal</Subtotal>
<Tax>tax</Tax>
<Total>grand total</Total>
</Receipt>
</Order>
Для того чтобы отобразить квитанцию, нам необходимо отобразить информацию клиента, общую сумму, налог и набор заказанных товаров. Поскольку там может быть переменное число элементов, это лучше всего отображать при помощи вложенного элемента управления данными, который привязан к набору узлов <Item>.
Для отображения информации о клиенте и детали платежа, добавьте FormView и привяжите его к новому элементу XmlDataSource, чье свойство DataFile установлено в ~/App_Data/PO.xml. Не волнуйтесь насчет того, что необходимо настроить свойство XPath. Далее, в ItemTemplate FormView используйте метод XPath("xpath") для отображения информации клиента и детали платежа:
<asp:FormView ID="Receipt" runat="server" DataSourceID="PODataSource">
<ItemTemplate>
<p><h3>RECEIPT</h3></p>
<p><b>Order Date:</b> <asp:Label runat="server" ID="OrderDateLabel" Text='<%#XPath("/Order/@orderDate")%>'></asp:Label></p>
<p>
<b><u>Customer Details:</u></b><br />
<b>Name:</b> <asp:Label runat="server" ID="NameLabel" Text='<%#XPath("/Order/Customer/Name")%>'></asp:Label><br />
<b>Card #:</b> <asp:Label runat="server" ID="CardNumberLabel" Text='<%#XPath("/Order/Customer/Cardnum")%>'></asp:Label><br />
</p>
... Items GridView to go here! ...
<p style="border-bottom:solid 1px black;">
<b>Subtotal:</b> <asp:Label runat="server" ID="SubtotalLabel" Text='<%#XPath("/Order/Receipt/Subtotal")%>'></asp:Label><br />
<b>Tax:</b> <asp:Label runat="server" ID="TaxLabel" Text='<%#XPath("/Order/Receipt/Tax")%>'></asp:Label><br />
</p>
<p>
<b>Total:</b> <asp:Label runat="server" ID="TotalLabel" Text='<%#XPath("/Order/Receipt/Total")%>'></asp:Label><br />
</p>
</ItemTemplate>
</asp:FormView>
Поскольку элемент управления XmlDataSource не имеет указанного значения XPath, к FormView привязан узел <Order>. Следовательно, для получения значения элемента <Name> из узла <Customer> нам необходимо использовать выражение XPath /Order/Customer/Name. Для того чтобы получить значение атрибута - orderDate, атрибут в элементе <Order> - добавьте к началу названия @ (т.е., /Order/@orderDate).
Вышеуказанный синтаксис привязки данных отображает информацию о клиенте и цене в FormView. Нам все еще необходимо отобразить набор <Item>. Для выполнения этого добавьте элемент GridView в пределах ItemTemplateDataSource набор узлов <Item> при помощи следующего синтаксиса: <asp:GridView runat="server" ... DataSource='<# XPathSelect("/Order/Manifest/Item") %>' ...>. Далее, в разделе GridView <Columns> добавьте TemplateField для каждого из пунктов: FormView и присвойте его свойству
<asp:FormView ID="Receipt" runat="server" DataSourceID="PODataSource">
<ItemTemplate>
...
<asp:GridView runat="server" ID="ItemsSummary" DataSource='<%# XPathSelect("/Order/Manifest/Item") %>'
AutoGenerateColumns="False">
<Columns>
<asp:TemplateField HeaderText="Title">
<ItemTemplate>
<asp:Label runat="server" ID="NameLabel" Text='<%#XPath("Title")%>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Qty" ItemStyle-HorizontalAlign="Right">
<ItemTemplate>
<asp:Label runat="server" ID="QuantityLabel" Text='<%#XPath("Quantity")%>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Unit Price" ItemStyle-HorizontalAlign="Right">
<ItemTemplate>
<asp:Label runat="server" ID="UnitPriceLabel" Text='<%#XPath("UnitPrice")%>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
...
</ItemTemplate>
</asp:FormView>

Вывод
ASP.NET 2.0 предлагает несколько элементов управления для работы с данными различного типа. К примеру, элемент SqlDataSource разработан для работы с информацией в реляционной базе данных. Как мы уже увидели в данной статье, для работы с XML-данными используется элемент XmlDataSource. Элемент управления XmlDataSource может осуществлять доступ к локальным или удаленным XML-файлам, либо может присвоить необработанную XML-информацию свойству Data. Также существуют опциональные свойства TransformFile и XPath, которые могут быть настроены на преобразование либо фильтрацию содержимого XML данных.
Как только вы настроите элемент XmlDataSource он может быть привязан к элементу управления данными. XML-содержимое, возвращенное элементом управления XmlDataSource, может быть получено в качестве скалярных значений при помощи XPath("xpath") или в качестве наборов узлов при помощи XPathSelect("xpath"). Рассмотрите приложение, доступное в конце данной статьи для получения более подробной информации о коде рассмотренных примеров.
Scott Mitchell