Цикл по элементам XML в XmlDataSource в коде позади - PullRequest
2 голосов
/ 13 февраля 2011

У меня есть XmlDataSource и GridView на моей странице.В случае события Page_Load я применяю XPath для фильтрации элементов xml в соответствии с вводом пользователя, LexiqueXmlDataSource.XPath = 'Some_XPath_here';, и все работает нормально.

Я хочу получить доступ к элементам, из которых возвращается XmlDataSourcecodebehind после применения выражения XPath (и, следовательно, получить их число).

Я попробовал метод GetXmlDocument(), но он возвращает весь исходный файл XML, а не отфильтрованные элементы с XPath.

РЕДАКТИРОВАТЬ:

вот код и сценарий, который я хочу:

protected void Page_Load(object sender, EventArgs e)
{

            string xpath = "/lexique/item[starts-with(@acronym, '" + filter + "')]";
            LexiqueXmlDataSource.XPath = xpath;

            // Here the XmlDataSource have filtered the xml elements to return to the GridView
            //I want to know how many element passed this filter using the XmlDataSource itself
}

Спасибо.

Ответы [ 3 ]

1 голос
/ 21 февраля 2011

Вот что я могу придумать.

По количеству попаданий.Используйте количество строк GridView.Действительно, GetXmlDocument.ChildNodes.Count всегда возвращает количество лексических элементов, а не количество обращений при применении выражения XPath.

Тест XML

<?xml version="1.0" encoding="utf-8" ?>
<lexique>
    <item acronym="WPF" value="Windows Presentation Foundation"/>
    <item acronym="SO" value="StackOverflow"/>
</lexique>

Минималистская страница ASP.net

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="xmlgrid.aspx.vb" Inherits="WebApplication1.WebForm1" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Label ID="FilterLabel" runat="server" Text="Acronym starting with:"></asp:Label>
        <asp:TextBox ID="FilterTextBox" runat="server"></asp:TextBox>
        <asp:XmlDataSource ID="LexiqueXmlDataSource" runat="server" DataFile="~/lexique.xml">
        </asp:XmlDataSource>
        <asp:GridView ID="LexiqueGrid" runat="server" AllowSorting="true" BorderStyle="Groove">
           <Columns>
              <asp:TemplateField HeaderText="Acronym">
                 <ItemTemplate>
                    <%# XPath("/lexique/item/@acronym")%>
                 </ItemTemplate>
              </asp:TemplateField>
              <asp:TemplateField HeaderText="Value">
                 <ItemTemplate>
                    <%# XPath("/lexique/item/@value")%>
                 </ItemTemplate>
              </asp:TemplateField>
           </Columns>
        </asp:GridView>
        <asp:Label ID="Hits" runat="server" Text="Acronyms found"></asp:Label>
        <asp:Button ID="Submit" runat="server" Text="Search" />
    </div>
    </form>
</body>
</html>

Код позади

Public Class WebForm1
    Inherits System.Web.UI.Page


    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim XPath As String

        If String.IsNullOrEmpty(FilterTextBox.Text) Then
            XPath = "/lexique/item"
        Else
            XPath = "/lexique/item[starts-with(@acronym, '" + FilterTextBox.Text + "')]"
        End If
        LexiqueXmlDataSource.XPath = XPath
        LexiqueXmlDataSource.DataBind()

        LexiqueGrid.DataSource = LexiqueXmlDataSource
        LexiqueGrid.DataBind()

        Hits.Text = "Selected " & LexiqueGrid.Rows.Count & " out of " &
            LexiqueXmlDataSource.GetXmlDocument.ChildNodes.Count & "Acronyms loaded."
    End Sub

End Class
1 голос
/ 13 февраля 2011

Если я правильно понимаю, вы хотите узнать количество возвращаемых элементов. Не будет ли выражение XPath 'count (Some_XPath_here) "не дать такое количество обращений?

0 голосов
/ 19 февраля 2011

вот код и сценарий I хочу:

protected void Page_Load(object sender, EventArgs e)
{

            string xpath = "/lexique/item[starts-with(@acronym, '" + filter + "')]";
            LexiqueXmlDataSource.XPath = xpath;

            // Here the XmlDataSource have filtered the xml elements to return to the GridView
            //I want to know how many element passed this filter using the XmlDataSource itself
}

Просто используйте и оцените это выражение XPath :

string xpath2 = "count(/lexique/item[starts-with(@acronym, '" + filter + "')])";
...