任务:HTML - Scala中的解析器。我对scala很新。
到目前为止:我在Scala中编写了一个Parser来解析一个随机的html文档。
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))
}
}
问题是“proc”不起作用。基本上,我想准确地获得一个节点的内容。或者是否有另一种方法可以在没有匹配的情况下实现这一目标?
loadxml-function中的“feed”是否为我提供了正确的解析格式,还是有更好的方法来实现? Feed让我回到根节点,对吗?
提前致谢
答案 0 :(得分:3)
你是对的:adapter.loadXML(source, parser)
为你提供了根节点。问题是该根节点可能不会与body
方法中的proc
大小写匹配。即使根节点是body
,它仍然不匹配,除非该元素只包含文本。
你可能想要更像这样的东西:
def proc(node: Node): String = (node \\ "body").text
其中\\
是一个大致相当于XPath //
的选择器方法 - 即,它返回名为node
的{{1}}的所有后代。如果您知道body
是根节点的子节点(而不是更深层次的后代)(可能是HTML的情况),则可以使用body
而不是\
。< / p>