如何遍历在单个scala.xml.Node中找到的子项列表

Jim*_*ond 3 scala

我从URL中删除了一些标记并返回单个scala.xml.Node,就像这样......

  def doGoogleSearch(query:String) : scala.xml.Node = {
    val tmpUrl = "http://www.google.com?q="
    val tmp = tmpUrl.concat(query)

    val url = new URL(tmp)
    val conn = url.openConnection

    val sorce:InputSource = new InputSource
    val neo = new TagSoupFactoryAdapter
    val input = conn.getInputStream

    sorce.setByteStream(input)
    val markup = neo.loadXML(sorce)
    input.close

    return markup
  }
Run Code Online (Sandbox Code Playgroud)

接下来我想循环遍历标记内的每个子元素,到目前为止我只看到打印2x(但这是大量的html回来).我在这里错过了什么?

def loopThroughChildren(markup:scala.xml.Node) : String = {
    for (i <- 0 until markup.child.length) {
      //println(??
    }
  return ""
}
Run Code Online (Sandbox Code Playgroud)

先感谢您!

Deb*_*ski 5

作为一个简单的解决方案,你可以说

markup.child.map { child =>
  // child is a scala.xml.Node
}
Run Code Online (Sandbox Code Playgroud)

并可能使用递归,具体取决于您想要做什么。


Knu*_*daa 5

无论如何,这是一个递归功能:

def processNode(node: Node) {
  if (node.isInstanceOf[Text]) println(node.text)
  node.child foreach processNode
}
Run Code Online (Sandbox Code Playgroud)

这将打印文档中所有文本节点的内容.如果你用它喂它:

<html>
    <head>
        <title>Welcome</title>
    </head>
    <body>
        <div>
            <p>Foo</p>
        </div>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

它会产生:

Welcome
Foo
Run Code Online (Sandbox Code Playgroud)