Scala - тег синтаксического анализа XML не работает должным образом - PullRequest
0 голосов
/ 23 мая 2019

Я очень новичок в 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 проблемы с этим кодом:

  1. Как я уже писал в комментарии, это не будет работать, если в файле изменяется порядок потоковых тегов
  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

Спасибо за вашу помощь

1 Ответ

0 голосов
/ 23 мая 2019

Я нашел ответ на другом форуме, вот правильный код для записи:

def getStreamId(Event: Node, StreamType: String): Option[String] = {
  (Event \ "_" \ "Stream")
    .find(_ \@ "streamType" == StreamType)
    .map(_ \@ "streamId")
}

Теперь, чтобы вызвать функцию, мне просто нужно сделать это:

val StreamId_Video = getStreamId(Event, "Video").getOrElse("")
val StreamId_Audio = getStreamId(Event, "Audio").getOrElse("")
val StreamId_Data = getStreamId(Event, "Data").getOrElse("")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...