4

私はscala.xml.pullを使用して、さまざまな大きなxmlファイルを解析しています。これはイベント処理にはうまく機能しますが、私がやりたいのは、パーサーに特定のノードのミニドキュメントを吐き出させることであり、これを行う簡単な方法、または少なくとも「スカラ」の方法ではありません。

私は、イテレータを使用して、タグに一致する EvElemStart イベントを見つけることができる、次のようなシーク関数を構築することを考えています。

def seek(tag: String) = {
  while (it.hasNext) {
    it.next match {
      case EvElemStart(_, `tag`, _, _) => 

その後、私はあまり明確ではありません。XMLEventReader がポップアウトするすべてのイベントを反復するのではなく、このタグのすべての子をドキュメントに取得する簡単な方法はありますか?

私が最終的に探しているのは、ファイルをスキャンし、通常の scala xml 処理を使用して処理できる特定のタグまたはタグのセットのインスタンスごとに xml 要素 (Elem ?) を発行するプロセスです。

4

2 に答える 2

2

これが私がやったことです。slurp(tag)は、タグの次のインスタンスを探し、そのタグの完全なノードツリーを返します。

def slurp(tag: String): Option[Node] = {
  while (it.hasNext) {
    it.next match {
      case EvElemStart(pre, `tag`, attrs, _) => return Some(subTree(tag, attrs))
      case _ => 
    }
  }
  return None
}

def subTree(tag: String, attrs: MetaData): Node = {
  var children = List[Node]()

  while (it.hasNext) {
    it.next match {
      case EvElemStart(_, t, a, _) => {
        children = children :+ subTree(t, a)
      }
      case EvText(t) => {
        children = children :+ Text(t)
      }
      case EvElemEnd(_, t) => {
        return new Elem(null, tag, attrs, xml.TopScope, children: _*)
      }
      case _ =>
    }
  }
  return null   // this shouldn't happen with good XML
}
于 2012-12-03T02:41:40.490 に答える