1

提及它的文档 scala.xml.pull.XMLEventReader可以用作Iterator[XMLEvent]. 但是,这样做时,XML 错误会导致方法调用未终止。例如:

scala> new xml.pull.XMLEventReader(io.Source.fromString("<a><b></a>")).toArray
Exception in thread "XMLEventReader" scala.xml.parsing.FatalError: expected closing tag of b
    at scala.xml.parsing.MarkupParser$class.errorNoEnd(MarkupParser.scala:41)
    at scala.xml.pull.XMLEventReader$Parser.errorNoEnd(XMLEventReader.scala:56)
    at scala.xml.parsing.MarkupParserCommon$class.xEndTag(MarkupParserCommon.scala:93)
    at scala.xml.pull.XMLEventReader$Parser.xEndTag(XMLEventReader.scala:56)
    at scala.xml.parsing.MarkupParser$class.element1(MarkupParser.scala:543)
    at scala.xml.pull.XMLEventReader$Parser.element1(XMLEventReader.scala:56)
    at scala.xml.parsing.MarkupParser$class.content1(MarkupParser.scala:396)
    at scala.xml.pull.XMLEventReader$Parser.content1(XMLEventReader.scala:56)
    at scala.xml.parsing.MarkupParser$class.content(MarkupParser.scala:417)
    at scala.xml.pull.XMLEventReader$Parser.content(XMLEventReader.scala:56)
    at scala.xml.parsing.MarkupParser$class.element1(MarkupParser.scala:542)
    at scala.xml.pull.XMLEventReader$Parser.element1(XMLEventReader.scala:56)
    at scala.xml.parsing.MarkupParser$class.content1(MarkupParser.scala:396)
    at scala.xml.pull.XMLEventReader$Parser.content1(XMLEventReader.scala:56)
    at scala.xml.parsing.MarkupParser$class.document(MarkupParser.scala:216)
    at scala.xml.pull.XMLEventReader$Parser.document(XMLEventReader.scala:56)
    at scala.xml.pull.XMLEventReader$Parser$$anonfun$run$1.apply(XMLEventReader.scala:90)
    at scala.xml.pull.XMLEventReader$Parser$$anonfun$run$1.apply(XMLEventReader.scala:90)
    at scala.xml.pull.ProducerConsumerIterator$class.interruptibly(XMLEventReader.scala:113)
    at scala.xml.pull.XMLEventReader.interruptibly(XMLEventReader.scala:26)
    at scala.xml.pull.XMLEventReader$Parser.run(XMLEventReader.scala:90)
    at java.lang.Thread.run(Thread.java:680)

这个调用永远不会终止。我们在这里看到解析异常被打印,但它似乎没有中断对toArray. 这似乎是因为实际的解析发生在一个单独的线程中,该线程被终止,但是错误永远不会报告给调用线程(这在问题 SI-4267 中有描述)。是否有可能以某种方式在调用线程上重新引发这些异常?甚至打算使用这个类,还是我应该使用另一个拉解析器?

4

2 回答 2

1

如果您正在寻找拉式解析和 Scala,您可能应该查看Scales Xml

特别是在这种情况下,拉解析由实际拉解析器(jdk stax)驱动,并且可以插入实际使用的 XMLInputFactory,从而允许您根据 stax 标准 api 自定义错误处理或文档处理。

再加上 Iterator 和 Iteratee 解析的能力,您在如何处理文档方面获得了很大的灵活性。

下一个版本 0.5 还将尝试使用Aalto XML来提供完全异步处理。

您的实际示例转换为:

import scales.xml._
import ScalesXml._

try{
  val s = pullXml(new java.io.StringReader("<a><b></a>")).toArray
} finally {
  println("Same thread")
}

并运行为(保存在 Experiments.scalaScript 中并通过 repl 加载):

scala> :load .\experiments.scalaScript
Loading .\experiments.scalaScript...
import scales.xml._
import ScalesXml._
Same thread
javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,9]
Message: The element type "b" must be terminated by the matching end-tag "</b>".
        at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:594)

有关拉解析的更多示例,请参见此处

于 2012-07-28T12:30:01.403 回答
0

我也遇到了。某处有一个补丁版本(在我自己的代码库中还找不到链接),我们用了一段时间来解决这个问题——在完全放弃它之前。

于 2012-07-27T06:48:01.703 回答