2012-04-13 8 views
3

Für eine XML-Schnipsel wie folgt aus:Extrahieren von XML-Elemente mit bestimmten untergeordneten Elementgehalte mit 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> 

tun so etwas wie:

fruits \\ "fruit" 

eine Folge von Typ zurückgeben scala.xml.NodeSeq mit allen Früchten und Unterknoten innerhalb.

Wie kann ich diese Sequenz begrenzen, um nur die Fruchtelemente mit "Banane" zu enthalten. dh, möchte ich das Ergebnis sein:

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

die '' -Tags in Ihre erwartete Leistung bis stimmen nicht überein. – dhg

Antwort

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" 

Gibt die NodeSeq:

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

Ich würde "equals" anstatt "contains" verwenden, aber ansonsten ist diese Lösung perfekt. –

+0

@ChrisJamesC, gibt die 'flatMap' eine' List [String] 'zurück, falls mehrere' 'Knoten vorhanden sind. Also 'contains' stellt sicher, dass mindestens einer von ihnen" Banane "sagt. – dhg

+0

Mein schlecht, jetzt verstehe ich. Danke für die Präzision. –

Verwandte Themen