3

タスク: HTML - Scala のパーサー。私はscalaにかなり慣れていません。

これまでのところ、ランダムな html ドキュメントを解析するための小さなパーサーを Scala で作成しました。

import scala.xml.Elem
import scala.xml.Node
import scala.collection.mutable.Queue
import scala.xml.Text
import scala.xml.PrettyPrinter

object Reader {
  def loadXML = {
    val parserFactory = new org.ccil.cowan.tagsoup.jaxp.SAXFactoryImpl
    val parser = parserFactory.newSAXParser()
    val source = new org.xml.sax.InputSource("http://www.randomurl.com")
    val adapter = new scala.xml.parsing.NoBindingFactoryAdapter
    val feed = adapter.loadXML(source, parser)
    feed
  }

  def proc(node: Node): String =
    node match {
      case <body>{ txt }</body> => "Partial content: " + txt
      case _ => "grmpf"
    }

  def main(args: Array[String]): Unit = {
    val content = Reader.loadXML
    Console.println(content)
    Console.println(proc(content))

  }
}
  1. 問題は、「proc」が機能しないことです。基本的に、1 つのノードのコンテンツを正確に取得したいと考えています。または、一致せずにそれを達成する別の方法はありますか?

  2. loadxml-function の「フィード」は、解析に適した形式を返しますか、それともそれを達成するためのより良い方法はありますか? フィードはルート ノードを返しますよね?

前もって感謝します

4

1 に答える 1

3

その通りですadapter.loadXML(source, parser)。ルート ノードが表示されます。問題は、そのルート ノードがおそらくメソッドのbodyケースと一致しないことprocです。ルート ノードがbodyであっても、要素にテキストしか含まれていない限り、一致しません。

おそらく、次のようなものがもっと必要です。

def proc(node: Node): String = (node \\ "body").text

where\\は XPath とほぼ同等のセレクター メソッドです。つまり、 named//のすべての子孫を返します。それがルート ノードの (より深い子孫ではなく) 子であることがわかっている場合(おそらく HTML の場合)、代わりに.nodebodybody\\\

于 2012-08-22T21:06:13.460 に答える