2012-04-13 2 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> 

делать что-то вроде:

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

ответ

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', но в остальном это решение идеально. –

+0

@ChrisJamesC, 'flatMap' возвращает' List [String] 'в случае наличия нескольких' 'узлов. Поэтому 'contains' гарантирует, что хотя бы один из них говорит« банан ». – dhg

+0

Мой плохой, теперь я понимаю. Спасибо за точность. –

Смежные вопросы