2009-12-01 6 views
5

Estoy consultando una fuente RSS de Twitter y proporcionando los resultados en un repetidor para su visualización. Me gustaría obtener solo los primeros 5 resultados de la consulta XPath. ¿Hay alguna manera de hacerlo en la sintaxis de XPath o tengo que recorrer el XmlNodeList resultante para sacar los primeros 5?Obtenga un número específico de resultados de una consulta XmlDocument XPath

XmlDocument doc = new XmlDocument(); 
XmlTextReader reader = new XmlTextReader(rssPath); 
doc.Load(reader); 

XmlNodeList items = doc.SelectNodes("/rss/channel/item"); 

rptTwitter.ItemDataBound += new RepeaterItemEventHandler(rptTwitter_ItemDataBound); 
rptTwitter.DataSource = items; 
rptTwitter.DataBind(); 

Respuesta

9

Intentar esta consulta XPath en su lugar:

(/rss/channel/item)[position() <= 5] 

Se devuelve sólo los primeros cinco elementos que coincidan. Los paréntesis son importantes, ya que sin ellos la parte [position() <= 5] se aplica a la posición del elemento item en su elemento primario, en lugar de su posición en el conjunto de nodos resultante.

+0

Esto es exactamente lo que necesito en mi situación actual. ¡Gracias! –

8

Si desea continuar utilizando xpath, entonces debe observar el método de posición() en xpath. El uso de un predicado algo como esto ...

[position() < 6] 

... debería dar como resultado limitar los resultados sólo a los primeros 5 elementos. La respuesta de Welbog es su mejor referencia aquí (+1 a Welbog).

Sin embargo, si usted es capaz de utilizar .NET 3.5, entonces te recomiendo nos fijamos en mi respuesta aquí ...

What is the coolest thing you can do in <10 lines of simple code? Help me inspire beginners!

... y echar un vistazo a la sindicación API que hacen que manejar feeds RSS sea mucho más fácil. Luego, si solo quiere 5 elementos, use el método LINQ. Tome la colección para tomar un número específico de artículos.

Esto le permitirá expresarse mejor y no tener que preocuparse acerca de la estructura de la alimentación, espacios de nombres, etc.

Me di cuenta que no responde directamente a su pregunta, pero como mucha gente no sabe acerca estas nuevas API en .NET pensé que las mencionaría aquí.

Por lo tanto, su código para obtener sólo 5 artículos serían algo como esto ...

var xmlr = XmlReader.Create("http://twitter.com/statuses/public_timeline.rss") 
var first5Items = SyndicationFeed 
        .Load(xmlr) 
        .GetRss20Formatter() 
        .Feed 
        .Items 
        .Take(5); 
+0

Martin, gracias! Esta es una gran alternativa y creo que la usaré más a menudo. No estoy seguro de si el servidor de mi cliente es 3.5, así que me estoy alejando de LINQ ahora mismo, pero si descubro que lo tienen, lo usaré. Lo intenté localmente y funciona como un encanto. Me encanta tener las propiedades reales de los nodos RSS. –

Cuestiones relacionadas