Получение XML-данных с помощью XmlDataSource в ASP.NET 2.0 - Пример 2: Привязываем набор узлов ко вложенному элементу управления данными

ОГЛАВЛЕНИЕ

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