使用Scala提取具有特定子元素内容的XML元素

时间:2012-04-13 14:29:26

标签: xml scala

对于这样的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的序列,其中包含所有水果和子节点。

如何限制此序列仅包含内部带有'banana'的水果元素。即,我希望结果是:

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

1 个答案:

答案 0 :(得分: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>