我对 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)一旦它开始工作以获得每个流类型的正确值。)这个运行良好,但我有两个问题,这段代码:
这就是我使用此代码的原因:
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] 删除。
我来说两句