在将XML绑定到转发器之前对XML进行过滤和排序?

时间:2009-12-22 19:20:52

标签: c# repeater

如何在将xml绑定到转发器之前对其进行过滤,排序? 我有一个xml数据,我需要根据查询字符串进行过滤,然后在将其绑定到转发器之前对其进行排序。

我知道如何将xml与转发器绑定并且工作正常但我在基于查询字符串和排序的过滤方面遇到问题。

真的很感激任何帮助吗?

我的XML就像这样

<Categories>   
    <Category>
        <Title>Food<Title>
        <Date>12/1/2009</Date>
        <Duration>12/1/2009-12/1/2011</Duration>
        <Description>Who is hungry</Description>
     <Category>
<Categories>

我想按日期和持续时间排序。我还想按标题过滤(基于查询字符串)。

2 个答案:

答案 0 :(得分:3)

LINQ to XML可能就是这里的方法,但是如果你被困在2.0-land中,这将返回一个XPathNodeIterator,提供过滤和排序的XML:

 // xPathFilter is a valid XPath expression
 IEnumerable PrepareXml(XmlReader xmlReader, string xPathFilter) 
 {
     XPathNavigator  navigator  = new XPathDocument(xmlReader).CreateNavigator();

     // Compile is an XPathExpression factory method
     XPathExpression expression = XPathExpression.Compile(xPathFilter);

     // This sorts on the values of the selected nodes
     // You might make an overload to let the caller specify different comparers
     expression.AddSort(".", StringComparer.CurrentCulture);

     return navigator.Select(expression);
 }

请注意,如果您只需要过滤(而非排序),则可以在aspx模板中使用更简单的声明性TemplateControl.XPathSelect权限(链接文档中的示例与您的方案非常接近)。

XPathNodeIterator实现IEnumerable,因此您可以直接将转发器绑定到它。要获取子节点中的值,请使用TemplateControl.XPath方法,如下所示(您还可以使用适当的XPath表达式获取属性或子节点等):

 <ItemTemplate>
 We have <%# XPath("Title") %> available starting on <%# XPath("Date") %>:<br />
 <%# XPath("Description") %>
 </ItemTemplate>

答案 1 :(得分:2)

我会使用LINQ to XML的内置功能来处理过滤和放大排序。这是一个指向complex filtering的链接。这是一个展示如何做简单sorting的方法。

结合使用这两种技术,而不是将控件绑定到XML数据源,从最终的LINQ to XML处理绑定到生成的集合。

对于一些优秀的LINQ to XML示例,请转到here