2012-04-13 133 views
3

特定的子元素内容中提取XML元素像这样的XML片段:与斯卡拉

val fruits = 
<fruits> 
    <fruit> 
    <name>apple</name> 
    <taste>red</taste> 
    </fruit> 
    <fruit> 
    <name>banana</name> 
    <taste>yellow</taste> 
    </fruit> 
    <fruit> 
    <name>banana</name> 
    <taste>green</taste> 
    </fruit> 
    <fruit> 
    <name>apple</name> 
    <taste>green</taste> 
    </fruit> 
</fruits> 

做这样的事情:

fruits \\ "fruit" 

将返回scala.xml.NodeSeq类型的序列与所有的水果和子节点里面。

我怎样才能限制这个序列只包含里面带有“香蕉”的水果元素。也就是说,我希望得到的结果是:

<fruits> 
    <fruit> 
    <name>banana</name> 
    <taste>yellow</taste> 
    </fruit> 
    <fruit> 
    <name>banana</name> 
    <taste>green</taste> 
    </fruit> 
<fruits> 
+0

了''标签您期望的输出不匹配。 – dhg 2012-04-13 14:45:06

回答

4
(fruits \\ "fruit").filter(x =>  // filter the sequence of fruits 
    (x \\ "name")      // find name nodes 
    .flatMap(_.child.map(_.text)) // get all name node text values 
    .contains("banana"))    // see which name nodes contain "banana" 

返回NodeSeq

<fruit> 
    <name>banana</name> 
    <taste>yellow</taste> 
    </fruit> 
    <fruit> 
    <name>banana</name> 
    <taste>green</taste> 
    </fruit> 
+0

我会使用'equals'而不是'contains',否则这个解决方案是完美的。 – 2012-04-14 14:53:17

+0

@ChrisJamesC,'flatMap'在有多个''节点的情况下返回'List [String]'。所以'contains'确保至少有一个人说“香蕉”。 – dhg 2012-04-14 16:27:54

+0

我的不好,现在我明白了。感谢精确度。 – 2012-04-14 16:32:46