初始数据:
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 中元素/节点的顺序通常不重要。