Получение 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>
