2010-05-17 94 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