はい!少なくとも可能です。SAXParserFactory
提供された のモデルに独自のプールを作成できますDefaultSAXParserFactoryPool
。
import javax.xml.parsers.{ SAXParser, SAXParserFactory }
import scales.utils._, ScalesUtils._
import scales.xml._, ScalesXml._
import scales.xml.parser.sax.DefaultSaxSupport
object XIncludeSAXParserFactoryPool extends
resources.SimpleUnboundedPool[SAXParserFactory] { pool =>
def create = {
val parserFactory = SAXParserFactory.newInstance()
parserFactory.setNamespaceAware(true)
parserFactory.setFeature("http://xml.org/sax/features/namespaces", true)
parserFactory.setXIncludeAware(true)
parserFactory.setValidating(false)
parserFactory
}
val parsers = new resources.Loaner[SAXParser] with DefaultSaxSupport {
def loan[X](tThunk: SAXParser => X): X =
pool.loan(x => tThunk(x.newSAXParser))
}
}
loadXml
次に、呼び出しでパーサー プールを指定できます。
val doc = loadXml(
source = new FileReader("data/example.xml"),
parsers = XIncludeSAXParserFactoryPool.parsers
)
ただし、 に相対 URI があり、include
href
それらを (現在のディレクトリではなく) ドキュメントの場所に対して相対的に評価したい場合は、InputSource
がシステム ID を取得していることを確認する必要があることに注意してください。これを行う 1 つの方法を次に示します。
import java.io.File
import org.xml.sax.InputSource
loadXml(
source = new InputSource(new File("data/example.xml").toUri.toString),
parsers = XIncludeSAXParserFactoryPool.parsers
)
上記のすべては、0.5.0 と 0.6.0 で動作するはずです。
この問題を解決するためのより良い方法があれば、ぜひ聞いてみたいです。