我对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),使其具有每种流类型的正确值。) 这个程序运行良好,但是此代码存在两个问题:
这就是为什么我使用以下代码:
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
感谢您的帮助
答案 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("")