Scala-XML解析标记无法正常运行

时间:2019-05-23 08:23:41

标签: xml scala

我对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个变量中捕获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

感谢您的帮助

1 个答案:

答案 0 :(得分: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("")