2010-05-25 60 views
13

如何使用Scala将xml文档解析为流? 我已经在java中使用了Stax API来实现这一点,但我想知道是否有一个“scala”方法来做到这一点。如何使用Scala将xml文档解析为流?

+0

有没有人知道比解析“hello world”更复杂/完整的例子? – ScArcher2 2010-05-26 21:56:15

+0

我知道这件事,因为我曾与之交谈的人正在使用它。你想做什么,你有什么问题?询问更多问题。这将使下一个想要使用它的人更容易。 :-) – 2010-05-26 23:48:42

回答

24

使用包scala.xml.pull。段从该Scaladoc采取的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) 
    } 
} 

您可以拨打toIteratortoStreamer得到真正IteratorStream

这里是2.7版本,略有不同。然而,测试它似乎表明它不检测流的结束,与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

我不得不将我的代码更改为val er = new XMLEventReader()。initialize(src),但它看起来像在工作。谢谢! – ScArcher2 2010-05-26 21:03:30

+0

2.7 xml.pull是野蛮的borked,应该完全避免所有,但非常勇敢。 2.8情况大大改善。 – 2010-05-29 00:17:51

+0

即使现在scala.xml.pull仍然不是很好,我建议不要使用它:https://github.com/scala/scala-xml/issues/193 – 2018-02-27 02:22:25

-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) 

还有其他的...

+4

这不会将整个文档加载到内存中吗?我想分析它,并在我收到它时处理它,而不是先将整个文档存储在内存中。 – ScArcher2 2010-05-25 22:01:04

+1

@ ScArcher2:是的,这些不是流API。 – 2010-05-26 04:33:53