Исходные данные:
scala> val data = <Doc><Title>Doc</Title><Type><Type level="0">A</Type><Type level="1">B</Type></Type><Type><Type level="0">C</Type><Type level="1">D</Type><Type level="2">E</Type></Type></Doc>
data: scala.xml.Elem = <Doc><Title>Doc</Title><Type><Type level="0">A</Type><Type level="1">B</Type></Type><Type><Type level="0">C</Type><Type level="1">D</Type><Type level="2">E</Type></Type></Doc>
Что в XML выглядит следующим образом:
<Doc>
<Title>Doc</Title>
<Type>
<Type level="0">A</Type>
<Type level="1">B</Type>
</Type>
<Type>
<Type level="0">C</Type>
<Type level="1">D</Type>
<Type level="2">E</Type>
</Type>
</Doc>
Все узлы тег Type
с прогнозируемыми level
атрибутом и соответствующим значением:
scala> val types = (data \ "Type" \ "Type") map (x => (x \ "@level").text -> x.text)
types: scala.collection.immutable.Seq[(String, String)] =
List((0,A), (1,B), (0,C), (1,D), (2,E))
сгруппированных по level
:
types.groupBy(_._1).map { case (level, elems) => level -> elems.map(_._2) }
res3: scala.collection.immutable.Map[String,scala.collection.immutable.Seq[String]] =
Map(2 -> List(E), 1 -> List(B, D), 0 -> List(A, C))
Если вы хотите, группирование в соответствии с просьбой:
Type_1 : A | B
Type_2 : C | D | E
затем:
scala> (data \ "Type").zipWithIndex.map {case (s, idx) => idx -> (s \ "Type").map(_.text) }
res4: scala.collection.immutable.Seq[(Int, scala.collection.immutable.Seq[String])] =
List((0,List(A, B)), (1,List(C, D, E)))
Но это кажется неправильным для меня, потому что в XML порядок элементов/узлов, как правило, не должны дело.
спасибо! Я буду исследовать больше на одном и том же ... Точно. но вы знаете, что мы не можем изменить XML, поскольку этот исходный файл используется другими командами приложений ... – Debaditya
Я разделил его на 2, чтобы было легче читать. Вы можете заменить переменную 'types' выражением выше. –
о да ... получилось :) – Debaditya