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]