2016-04-06 8 views
1

ВходнойАнализировать XML в Scala

ввод XML в данных

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> 

Желаемая выход

Title : Doc 
Type_1 : A | B 
Type_2 : C | D | E 

То, что я пытался

Для названия -. (Данные // "Название") текст

Этот вопрос с тегами "Type" в XML

нужно сгруппировать каждый тип тега вместе

Ниже скриншот для всех пробованных команд для извлечения типа и группировки их, как и выше желаемого результата. Extracting type tags

Нужно руководствоваться логикой о том, как мы можем группировать теги типа в соответствии с желаемым результатом.

ответ

1

Исходные данные:

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 порядок элементов/узлов, как правило, не должны дело.

+1

спасибо! Я буду исследовать больше на одном и том же ... Точно. но вы знаете, что мы не можем изменить XML, поскольку этот исходный файл используется другими командами приложений ... – Debaditya

+1

Я разделил его на 2, чтобы было легче читать. Вы можете заменить переменную 'types' выражением выше. –

+0

о да ... получилось :) – Debaditya

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