是的!至少这是可能的。您可以在提供的模型上编写自己的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
)
请注意,如果您的include
href
s 中有相对 URI,并且您希望它们相对于文档的位置(而不是当前目录)进行评估,您需要确保 sInputSource
获取系统 ID。这是执行此操作的一种方法:
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 中工作。
如果有更好的方法来解决这个问题,我很想听听。