Получение XML-данных с помощью XmlDataSource в ASP.NET 2.0

ОГЛАВЛЕНИЕ

ASP.NET 2.0 значительно упрощает процесс работы с информацией при помощи элементов управления источником данных и усовершенствованными элементами управления. Во второй части данной серии статей мы рассмотрели способ использования элемента управления SqlDataSource для получения данных из реляционной базы данных и затем их можно привязать к любому элементу управления (к примеру GridView, DetailsView, FormView, DataList, Repeater и т.д). Посредством элемента XmlDataSource вы с легкостью можете осуществить доступ к XML-данным (а также отобразить их). Нет необходимости в написании кода при использовании элемента управления XmlDataSource, при этом осуществление доступа, фильтрации и преобразование данных является простым процессом. В дополнение добавленные к ASP.NET 2.0 методы привязки данных XPath() и XPathSelect() позволяют с легкостью отображать конкретные XML-значения либо привязать целиком набор узлов. При этом доступ к XML-данным может быть  осуществлен из локального файла, либо по ссылке на  ресурс  (URL). В данной статье мы рассмотрим способ использования элемента XmlDataSource, а также методов привязки данных XPath() и XPathSelect(), отображающих  результаты в различных элементах управления. Читайте далее, чтобы узнать больше об этом!


Основы 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") - возвращает набор узлов; может быть использована для привязки набора узлов ко вложенному элементу управления данными.
Вышеперечисленные выражения привязки данных должны быть представлены в пределах шаблонов. Для таких элементов управления, как GridView и DetailsView, которые составлены из полей (как BoundFields, CheckBoxFields и т.д.), используйте TemplateFields для каждого поля, которое вы хотите отобразить.


Пример 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

Исходный код примеров