Xml 解析日志文件并在Scala中转换为案例类
我确信如何处理以下问题。 假设我有这样一个日志文件:Xml 解析日志文件并在Scala中转换为案例类,xml,scala,parsing,Xml,Scala,Parsing,我确信如何处理以下问题。 假设我有这样一个日志文件: asdasdçkpoiwqe askdjadlskjqw <stuff> <a>some val</a> <b>some val</b> </stuff> kasdjllasdj clkj skdjalkd <moreStuff> <c>some val</c> <d>some val<
asdasdçkpoiwqe
askdjadlskjqw
<stuff>
<a>some val</a>
<b>some val</b>
</stuff>
kasdjllasdj
clkj
skdjalkd
<moreStuff>
<c>some val</c>
<d>some val</d>
</moreStuff>
iuoudnas
salkdj
sdmlaks
<moreStuff>
<c>more val</c>
<d>some val</d>
</moreStuff>
...
def parseMoreStuff(line: String, it: Iterator) = {
var l = line
while(!line.equals("</moreStuff>")){
l += line
it.next()
}
该代码:
val filename = "logFile.log"
for (line <- Source.fromFile(filename).getLines) {
line match {
case "<stuff>" => parseStuff(line)
case "<moreStuff>" => parseMoreStuff(line)
case _ => println("Not Defined"+ line)
}
}
def parseStuff(line: String) = {
//Create a List[Stuff]
}
def parseMoreStuff(line: String) = {
//Create a List[Stuff]
}
现在我只有一个字符串l
,它只包含xml内容,可以作为xml处理。我运行了这段代码,得到了一个java.util.NoSuchElementException:next on empty iterator
,但无论如何,我认为这种方法是一个大混乱(即使我可以解决这个异常)。我不喜欢它,所以我的问题是,是否有更干净的方法来解析具有此特征的日志文件
提前感谢一种方法是首先忽略垃圾文本:
val xmlAsString =
Source.fromFile(filename)
.getLines
.map(_.trim)
.filter(_.startsWith("<"))
.mkString
// <stuff><a>some val</a><b>some val</b></stuff><moreStuff><c>some val</c><d>some val</d></moreStuff><moreStuff><c>more val</c><d>some val</d></moreStuff>
然后,要获得Seq
的Stuff
s和Seq
的MoreStuff
s:
def parseStuff(node: Node): Stuff = {
Stuff((node \ "a").toString, (node \ "b").toString)
}
def parseMoreStuff(node: Node): MoreStuff = {
MoreStuff((node \ "c").toString, (node \ "d").toString)
}
val stuffs = (xmlDoc \ "stuff").map(parseStuff) // Seq[Stuff]
val moreStuffs = (xmlDoc \ "moreStuff").map(parseMoreStuff) // Seq[MoreStuff]
是的,它是有效的,但我的例子被简化了。我可以有一行以“
junkxxxvalue datasdasa”开头,在本例中,startsWith(“
import scala.xml._
val xmlDoc = XML.loadString("<stuffRoot>" + xmlAsString + "</stuffRoot>")
def parseStuff(node: Node): Stuff = {
Stuff((node \ "a").toString, (node \ "b").toString)
}
def parseMoreStuff(node: Node): MoreStuff = {
MoreStuff((node \ "c").toString, (node \ "d").toString)
}
val stuffs = (xmlDoc \ "stuff").map(parseStuff) // Seq[Stuff]
val moreStuffs = (xmlDoc \ "moreStuff").map(parseMoreStuff) // Seq[MoreStuff]