关于查找具有与scala匹配特定值的属性的所有节点

时间:2010-09-29 07:12:45

标签: xml scala

我之前看过以下示例,其中的目标是返回包含ID为X的属性的所有节点,其中包含值Y:

    //find all nodes with an attribute "class" that contains the value "test" 
val xml = XML.loadString( """<div> 
<span class="test">hello</span> 
<div class="test"><p>hello</p></div> 
</div>""" ) 

def attributeEquals(name: String, value: String)(node: Node) =  
{  
    node.attribute(name).filter(_==value).isDefined 
} 

val testResults = (xml \\ "_").filter(attributeEquals("class","test"))  
//prints: ArrayBuffer( 
//<span class="test">hello</span>,  
//<div class="test"><p>hello</p></div> 
//)  
println("testResults: " + testResults) 

我正在使用Scala 2.7,每次返回打印值始终为空。有人可以提供帮助吗? 对不起,如果我正在复制另一个帖子......但是如果我发布一个新帖子会觉得更明显?

1 个答案:

答案 0 :(得分:8)

根据Node ScalaDocattribute的定义如下:

 def attribute(key: String):Option[Seq[Node]]

因此,您应该以这样的方式修改代码:

def attributeEquals(name: String, value: String)(node: Node) =  
{  
    node.attribute(name).filter(_.text==value).isDefined // *text* returns a text representation of the node 
} 

但为什么不只是实现同样的简单:

scala> (xml descendant_or_self) filter{node => (node \ "@class").text == "test"}
res1: List[scala.xml.Node] = List(<span class="test">hello</span>, <div class="test"><p>hello</p></div>)