Scala - XML 解析标记无法正常工作

塞布奇

我对 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 个流 ID。

我试过这个代码:

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)一旦它开始工作以获得每个流类型的正确值。)这个运行良好,但我有两个问题,这段代码:

  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

谢谢你的帮助

塞布奇

我在另一个论坛上找到了答案,这里是正确的代码:

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("")

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章