2010-05-25 4 views
13

Wie analysiere ich ein XML-Dokument als Stream mit Scala? Ich habe die Stax-API in Java verwendet, um dies zu erreichen, aber ich würde gerne wissen, ob es eine "skalare" Möglichkeit gibt, dies zu tun.Wie analysiere ich ein XML-Dokument als Stream mit Scala?

+0

Kennt jemand ein komplizierteres/vollständigeres Beispiel als das Parsen von "Hallo Welt"? – ScArcher2

+0

Ich wusste von dieser Sache, weil jemand, mit dem ich einmal gesprochen habe, es benutzte. Was versuchst du zu tun und welche Probleme hast du damit? Stellen Sie weitere Fragen. Es wird es der nächsten Person erleichtern, die es benutzen möchte. :-) –

Antwort

24

Verwenden Paket scala.xml.pull. Schnipsel aus dem Scaladoc genommen für Scala 2.8:

import scala.xml.pull._ 
import scala.io.Source 
object reader { 
    val src = Source.fromString("<hello><world/></hello>") 
    val er = new XMLEventReader(src) 
    def main(args: Array[String]) { 
    while (er.hasNext) 
     Console.println(er.next) 
    } 
} 

Sie toIterator oder toStream auf er nennen kann eine echte Iterator oder Stream zu bekommen.

Und hier ist die 2.7-Version, die etwas anders ist. Das Testen scheint jedoch darauf hinzudeuten, dass das Ende des Streams nicht erkannt wird, im Gegensatz zu Scala 2.8.

import scala.xml.pull._ 
import scala.io.Source 

object reader { 
    val src = Source.fromString("<hello><world/></hello>") 
    val er = new XMLEventReader().initialize(src) 

    def main(args: Array[String]) { 
    while (er.hasNext) 
     Console.println(er.next) 
    } 
} 
+0

Ich musste meinen Code ändern, um val = new XMLEventReader(). Initialize (src), aber es sieht aus wie es funktioniert. Vielen Dank! – ScArcher2

+0

der 2.7 xml.pull ist wild geborst und sollte von allen, außer den sehr Mutigen ganz gemieden werden. 2.8 Situation ist viel besser. –

+0

scala.xml.pull ist auch jetzt noch nicht wirklich toll; Ich habe vorgeschlagen, es abzulehnen: https://github.com/scala/scala-xml/issues/193 –

-2
scala.xml.XML.loadFile(fileName: String) 
scala.xml.XML.load(url: URL) 
scala.xml.XML.load(reader: Reader) 
scala.xml.XML.load(stream: InputStream) 

Es gibt andere ...

+4

Wird das gesamte Dokument nicht in den Speicher geladen? Ich möchte es analysieren und behandeln, wie ich es empfange und nicht das gesamte Dokument zuerst im Speicher ablegen. – ScArcher2

+1

@ ScArcher2: Ja, das sind keine Streaming-APIs. –

Verwandte Themen