Я что-то здесь упускаю?
Разве вы не можете просто закомментировать / удалить ваш doc.Load (Server.MapPath ("~ / myxml / bookstore.xml")) в вашей подпункте itemDB?Так как вы определили документ "глобально" и уже загрузили его при загрузке страницы? (тем самым вы уже избежите перезагрузки xml)
Тем не менее я согласен с Каспаром в том, что вам лучше использовать XmlDatasource (особенно из-за его способности кеширования) , вам не нужно использовать XmlDatasource в вашей разметке - вы всегда можете определить его и в своем коде позади - поскольку вы беспокоитесь о том, чтобы люди видели ваш (на стороне сервера asp.net) разметка по какой-то причине ...
например,
Public Sub Page_Load(ByVal Sender As Object, ByVal E As EventArgs) Handles Me.Load
If Not Page.IsPostBack Then
Dim source As New XmlDataSource()
source.DataFile = "~/myxml/bookstore.xml"
source.XPath = "Bookings/Booking[@CLIENT_NO='SA33762']"
rpMyRepeater.DataSource = source
rpMyRepeater.DataBind()
End If
End Sub
Разметка: (Приятно отметить, что мы связываем второй повторитель, используя источникот первого повторителя)
<asp:Repeater ID="rpMyRepeater" runat="server">
<ItemTemplate>
<%#XPath("//Booking/NAME/text()")%>
<asp:Repeater runat="server" ID='books' DataSource='<%#XPathSelect("//Booking/Products/Book") %>'>
<HeaderTemplate>
<h2>
Books</h2>
</HeaderTemplate>
<ItemTemplate>
<p>
Title:
<%#XPath("TITLE/text()")%></p>
<p>
<%#XPath("BOOKCODE/text()")%></p>
</ItemTemplate>
</asp:Repeater>
</ItemTemplate>
</asp:Repeater>
XML
<?xml version="1.0" encoding="utf-8" ?>
<Bookings>
<Booking CLIENT_NO="SA33762">
<NAME>Mr Pf_Test_15033</NAME>
<Products>
<Book>
<TITLE>My Book</TITLE>
<BOOKCODE>12345</BOOKCODE>
</Book>
<Book>
<TITLE>My Book2</TITLE>
<BOOKCODE>123456</BOOKCODE>
</Book>
</Products>
</Booking>
</Bookings>
Реализация с использованием элемента управления ListView (один из моих любимых элементов управления asp.net) выглядит примерно так: (если книг нет в наличии, будет отображаться разметка в пустом шаблоне данных)
<asp:Repeater ID="rpMyRepeater" runat="server">
<ItemTemplate>
<%#XPath("//Booking/NAME/text()")%>
<asp:ListView runat="server" ID="books" ItemPlaceholderID="phItems" DataSource='<%#XPathSelect("//Booking/Products/Book") %>'>
<LayoutTemplate>
<h2>
Books</h2>
<asp:PlaceHolder runat="server" ID="phItems"></asp:PlaceHolder>
</LayoutTemplate>
<ItemTemplate>
<p>
Title:
<%#XPath("TITLE/text()")%></p>
<p>
<%#XPath("BOOKCODE/text()")%></p>
</ItemTemplate>
<EmptyDataTemplate>
<p>
Sorry no books available</p>
</EmptyDataTemplate>
</asp:ListView>
</ItemTemplate>
</asp:Repeater>