Я очень новичок в Scala и пытаюсь разобрать xml-файл, чтобы преобразовать его в csv для дальнейшей обработки другой программой scala.
В этом XML-файле у меня есть такие теги:
<Event EventTime="2018-12-25T22:26:58" ProfileID="0031053794_0">
<StreamEvent>
<Stream streamId="160" streamType="Video"/>
<Stream streamId="80" streamType="Audio"/>
<Stream streamId="0" streamType="Data"/>
</StreamEvent>
</Event>
Мое беспокойство связано с перехватом 3-х потокового идентификатора в переменных.
Я пробовал этот код:
def getStreamId(Event: Node, StreamType: String) = {
//To improve -- Using head , (1) and last can cause trouble if the order changes in the file
if (StreamType == "Video") {
val StreamID = (Event \ "_" \ "Stream" \\ "@streamId").head.text
StreamID
} else if (StreamType == "Audio") {
val StreamID = (Event \ "_" \ "Stream" \\ "@streamId")(1).text
StreamID
} else {
val StreamID = (Event \ "_" \ "Stream" \\ "@streamId").last.text
StreamID
}
}
(я знаю, что этот код даст мне одинаковое значение для каждого StreamType, но я думаю об использовании первой части, которая будет похожа на val Type = (Event \ "" \ "Stream" \ "@StreamType" ) .filter ( == Streamtype), когда он работает, чтобы иметь правильное значение каждого типа потока.)
Этот работает хорошо, но у меня есть 2 проблемы с этим кодом:
- Как я уже писал в комментарии, это не будет работать, если в файле изменяется порядок потоковых тегов
- У меня также есть События, где нет тегов. В этом случае я получил ошибку во время выполнения моего кода, потому что «head», «(1)» и «last» не могут быть использованы для пустого объекта
Вот почему я использовал этот код:
def getStreamId(Event: Node, StreamType: String) = {
if (StreamType == "Video") {
val StreamID = (Event \ "_" \ "Stream" \\ "@streamId").text
StreamID
} else if (StreamType == "Audio") {
val StreamID = (Event \ "_" \ "Stream" \\ "@streamId").text
StreamID
} else {
val StreamID = (Event \ "_" \ "Stream" \\ "@streamId").text
StreamID
}
}
Результат этого кода: StreamID одинаков для обоих случаев и равен 160800 (затем объединение каждого StreamID)
По этим причинам я пробовал следующий код:
if (StreamType == "Video") {
val StreamID= (Event \ "_" \ "Stream" \ "@streamId").text
StreamID
} else if (StreamType == "Audio") {
val StreamID = (Event \ "_" \ "Stream" \ "@streamId").text
StreamID
} else {
val StreamID = (Event \ "_" \ "Stream" \ "@streamId").text
StreamID
}
К сожалению, с этим кодом ничего не возвращается, даже если есть теги. Я не вижу, в чем проблема с последним кодом, потому что я следую точному порядку тегов файла
Я вызываю функцию getStreamID с помощью:
val StreamId_Video = getStreamId(Event, "Video")
val StreamId_Audio = getStreamId(Event, "Audio")
val StreamId_Data = getStreamId(Event, "Data")
Подводя итог, мой вопрос: почему этот код:
val StreamID= (Event \ "_" \ "Stream" \ "@streamId").text
ничего не возвращает?
Тогда мой ожидаемый результат:
StreamId_Video = 160, StreamId_Audio = 80 и StreamId_Data = 0
Спасибо за вашу помощь