2012-04-13 7 views
3

で特定の子要素の内容でXML要素の抽出:このようなXMLスニペットのためのScala

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> 

ような何かやって:すべての果物とタイプscala.xml.NodeSeqのシーケンスを返します

fruits \\ "fruit" 

をし、内部のサブノード。

「バナナ」が入ったフルーツ要素のみを含むようにこのシーケンスを制限する方法を教えてください。つまり、私は結果になりたい:

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

あなたの期待出力に '' タグが一致しません。 – dhg

答えて

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

私は 'contains'の代わりに' equals'を使用しますが、そうでなければこの解決策は完璧です。 –

+0

@ChrisJamesC、 'flatMap'は複数の' 'ノードがある場合に 'List [String]'を返します。だから、「包含する」は、少なくとも1人が「バナナ」と言うことを確かめる。 – dhg

+0

私の悪い、今私は理解する。精度に感謝します。 –

関連する問題