Как перебрать список детей, найденных внутри одного scala.xml.Node - PullRequest
3 голосов
/ 20 января 2011

Я вытаскиваю некоторую разметку из 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
  }

Далее я хочу пройтись по каждому дочернему элементу внутри разметки, и то, что у меня пока есть, только печатает 2 раза (хотя это огромное количество html, возвращающихся). Что мне здесь не хватает?

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

Заранее спасибо!

Ответы [ 4 ]

5 голосов
/ 20 января 2011

В любом случае, вот вам рекурсивная функция:

def processNode(node: Node) {
  if (node.isInstanceOf[Text]) println(node.text)
  node.child foreach processNode
}

Это напечатает содержимое всех текстовых узлов в документе.Если вы накормите его, например:

<html>
    <head>
        <title>Welcome</title>
    </head>
    <body>
        <div>
            <p>Foo</p>
        </div>
    </body>
</html>

, то получится:

Welcome
Foo
4 голосов
/ 20 января 2011

В качестве простого решения вы можете сказать

markup.child.map { child =>
  // child is a scala.xml.Node
}

и, возможно, использовать рекурсию, в зависимости от того, что вы хотите сделать.

3 голосов
/ 20 января 2011

или эквивалентно

for(child<-markup.child){
 // child is a scala.xml.Node
}
0 голосов
/ 17 декабря 2013

Это примет аргумент командной строки (имя файла) и напечатает все найденные метки тега:

import scala.xml._
import scala.annotation.tailrec

object XmlTagLister extends App {
  require(args.length == 1, "You must provide an XML filename to be analyzed.")

  val data = XML.loadFile(args(0))

  @tailrec
  def collectTags(elems: List[Node], tags: Set[String]): Set[String] =
    elems match {
      case h :: t => collectTags((h \ "_").theSeq.toList ::: t, tags + h.label)
      case Nil => tags
    }

  val allTags = collectTags((data \ "_").toList, Set())

  allTags foreach println
}

Вывод выглядит так:

onetag
AnotherTag
anothertag

(теги XML чувствительны к регистру)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...