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を探している場合は、おそらくScalesXmlをチェックアウトする必要があります。

特にこの場合、プル解析は実際のプルパーサー(jdk stax)によって駆動され、使用される実際のXMLInputFactoryをプラグインして、stax標準APIに従ってエラー処理またはドキュメント処理をカスタマイズできます。

それに加えて、IteratorとIterateeの両方で解析する機能があり、ドキュメントの処理方法に多くの柔軟性があります。

次のバージョン0.5でも、AaltoXMLを使用して完全に非同期の処理を提供しようとします。

実際の例は次のように変換されます。

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 に答える