2010-05-17 97 views
11

我试图解析RSS提要,看起来像这样的属性“日期”:斯卡拉:XML属性解析

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

我试过几个不同的版本:(RSSFeed中包含RSS数据)

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

但似乎没有任何工作。我错过了什么?

任何帮助真的很感谢!

+1

'rssFeed'?它不应该是'rss'吗? – VonC 2010-05-17 17:48:41

+1

rssFeed是一个包含RSS数据的变量 – Chris 2010-05-17 17:52:38

回答

18

<y:c中的“y”是一个名称空间前缀。这不是名称的一部分。此外,属性被称为'@'。试试这个:

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

使用“@attrName”选择器检索属性。因此,您的选择实际上应该是类似以下内容:

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

注意.text将日期作为字符串而不是节点 – sblundy 2010-05-17 18:03:27

+1

的确如此。 'text'方法通常比'toString'更受欢迎,因为它将优雅地处理选择器抓取一块XML而不是'Text'节点的情况。 – 2010-05-17 18:17:52

3

此外,想想\和\\之间的差异。 \\寻找后代,而不仅仅是一个孩子,像这样的(注意,从通道到C跳跃,无项目):

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

或者这样的事情,如果你只是希望所有的<Ç >元素,并且不关心自己的父母:

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

,这将会指定一个确切的路径:

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

考虑使用序列解析,太。它们对于处理XML很有用,特别是在需要复杂条件时。

对于简单的情况:

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

使你从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) 
} 

为您提供:

<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