2012-02-28 42 views
2

這個工程:階節點的比賽情況

<a>apple</a> 

node match { 
    case <a>{contents}</a> => "It's an a: "+ contents 
    case _ => "It's something else." 
} 

我怎麼能更改這個例子,所以它僅匹配與標籤「a」和屬性ID = 2的節點: 東西如下:

<a id="2">apple</a> 

node match { 
    case <a id="2">{contents}</a> => "It's an a: "+ contents 
    case _ => "It's something else." 
} 

但這不能編譯。

+0

請參閱[這個問題](http://stackoverflow.com/questions/2610191/scala-xml-pattern-matching-and-attributes)。 – Philippe 2012-02-28 14:42:25

+0

看看這個[文章] [1] [1]:http://stackoverflow.com/questions/2610191/scala-xml-pattern-matching-and-attributes – Eduardo 2012-02-28 14:45:52

回答

3

下面是做到這一點的一種方法:

node match { 
    case a @ <a>{contents}</a> if (a \ "@id").text == "2" => "It's an a: " + contents 
    case _ => "It's something else." 
} 
+0

這是一個遺憾,它沒有很好的整合。 – 2012-02-28 16:47:45

2

看起來你需要完整的XPath支持編寫查詢,如「一[ID =‘2’]」

Scala scales是可用選項之一。

但除了Philippe's answer我可以建議該查詢

import scala.xml.Text 
val node = <a id="2">apple</a> 
(node \\"a" \"@id").text match { 
    case "2" => "It's an a: "+ (node \\"a").text 
    case _ => "It's something else." 
} 
3

另一種方式,只是爲了它的緣故。

<a id="2">apple</a> match { 
    case Node("a", Attribute("id", Text("2"), _), Text(contents)) => contents 
} 

雖然對多個屬性不起作用。