2010-05-17 26 views
11

Estoy tratando de analizar un canal RSS que tiene este aspecto para el atributo "fecha":Scala: XML Atributo análisis

<rss version="2.0"> 
<channel> 
    <item> 
     <y:c date="AA"></y:c> 
    </item> 
</channel> 
</rss> 

He intentado varias versiones diferentes de esta: (RssFeed contiene los datos RSS)

println(((rssFeed \\ "channel" \\ "item" \ "y:c" \"date").toString)) 

Pero nada parece funcionar. ¿Qué me estoy perdiendo?

¡Cualquier ayuda sería realmente apreciada!

+1

'rssFeed':

val rssFeed = <rss version="2.0"> <channel> <item> <y:c date="AA"></y:c> <y:c date="AB"></y:c> <y:c date="AC"></y:c> </item> </channel> </rss> val sep = "\n----\n" for { channel <- rssFeed \ "channel" item <- channel \ "item" y <- item \ "c" date <- y \ "@date" if (date text).equals("AA") } yield { val s = List(channel, item, y, date).mkString(sep) println(s) } 

Te da? ¿No debería ser 'rss'? – VonC

+1

rssFeed es una variable que contiene los datos RSS – Chris

Respuesta

18

La "y" en <y:c es un prefijo del espacio de nombres. No es parte del nombre. Además, los atributos se denominan con '@'. Prueba esto:

println(((rssFeed \\ "channel" \\ "item" \ "c" \ "@date").toString)) 
14

Los atributos se recuperan con el selector "@attrName". Por lo tanto, el selector debe ser en realidad algo como lo siguiente:

println((rssFeed \\ "channel" \\ "item" \ "c" \ "@date").text) 
+1

Tenga en cuenta el texto para obtener la fecha como una cadena en lugar de un nodo – sblundy

+1

De hecho. El método 'text' generalmente es preferible a' toString', ya que manejará con gracia el caso en el que su selector haya tomado una porción de XML en lugar de un nodo 'Text'. –

3

Además, pensar en la diferencia entre \ y \\. \\ busca un descendiente, no sólo un niño, como este (tenga en cuenta que los saltos de canal en C, sin artículo):

scala> (rssFeed \\ "channel" \\ "c" \ "@date").text 
res20: String = AA 

O este tipo de cosas si lo que desea todo el < c > elementos, y no se preocupan por sus padres:

scala> (rssFeed \\ "c" \ "@date").text    
res24: String = AA 

y esto especifica una ruta completa:

scala> (rssFeed \ "channel" \ "item" \ "c" \ "@date").text 
res25: String = AA 
3

pensar sobre el uso de secuencias de comprensiones, también. Son útiles para tratar con XML, especialmente si necesita condiciones complicadas.

Para el caso simple:

for { 
    c <- rssFeed \\ "@date" 
} yield c 

le da la fecha de atributo de todo en RssFeed.

Pero si quieres algo más complejo:

<channel> 
         <item> 
          <y:c date="AA"></y:c> 
          <y:c date="AB"></y:c> 
          <y:c date="AC"></y:c> 
         </item> 
         </channel> 
    ---- 
    <item> 
          <y:c date="AA"></y:c> 
          <y:c date="AB"></y:c> 
          <y:c date="AC"></y:c> 
         </item> 
    ---- 
    <y:c date="AA"></y:c> 
    ---- 
    AA