2010-04-09 100 views
12

首先:我在Scala 2.8Scala XML模式匹配和屬性

我在使用XML元素上的模式匹配時遇到了一個小問題。我知道我可以做這樣的事情:

val myXML = <a><b>My Text</b></a> 
myXML match { 
    case <a><b>{theText}</b></a> => println(theText) 
    case _ => 
} 

這是哪門子例子,我發現到處在網上和我的兩個Scala的書籍。但是,如果我想根據屬性在XML元素上進行匹配,該怎麼辦?

val myXML = <a><b type="awesome">An awesome Text!</b></a> 
myXML match { 
    case <a><b type={textType}>{theText}</b><a> => println("An %s text: %s".format(textType, theText)) 
    case _ => 
} 

編譯器將拋出一個error: in XML literal: '>' expected instead of 't'我,這說明因爲編譯器預計元素的標籤被關閉,我不能使用屬性。如果我嘗試將具有固定屬性的XML元素與大括號相匹配,則會引發同樣的錯誤。

所以我的問題很簡單:我該如何做這樣的比賽?我是否必須爲比賽創建Elem而不是使用那些漂亮的文字?如果:最好的辦法是什麼?

回答

17

處理屬性更應該是一種痛苦。事實上,這個特殊的例子表明,Scala不會像構造它們那樣解構XML,因爲這個語法對於XML文字是有效的。無論如何,這是一種方式:

myXML match { 
    case <a>{b @ <b>{theText}</b>}</a> => 
    println("An %s text: %s".format(b \ "@type", theText)) 
} 
+0

我想這將是更痛苦的情況下,只有類型屬性具有特定值的節點匹配。 :-(對嗎? – Malax 2010-04-09 20:00:59

+3

@Malax不是,只要在'=>'之前加上'if b'@type「== Text(」whatever「)'或者'if(b \」@type 「).toString ==」whatever「'。 – 2010-04-09 21:40:32