我之前看过以下示例,其中的目标是返回包含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,每次返回打印值始终为空。有人可以提供帮助吗? 对不起,如果我正在复制另一个帖子......但是如果我发布一个新帖子会觉得更明显?
答案 0 :(得分:8)
根据Node
ScalaDoc,attribute
的定义如下:
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>)