我使用Scales library在Scala中处理XML,我希望在解析过程中扩展xi:include
elements。默认情况下不会发生这种情况 - 例如,如果我编写以下内容,XML文件中的任何include
元素将在解析的文档中显示为未展开:
import java.io.FileReader
import scales.utils._, ScalesUtils._
import scales.xml._, ScalesXml._
val doc = loadXml(new FileReader("data/example.xml"))
是否可以扩展这些元素?我使用的是Scales 0.6.0-M1。
答案 0 :(得分:1)
是的!这至少是可能的。您可以在提供的DefaultSAXParserFactoryPool
的模型上编写自己的SAXParserFactory
池:
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
中有相对URI,并且希望它们相对于文档的位置(而不是当前目录)进行评估,那么您需要确保InputSource
获取系统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中工作。
如果有更好的方法可以解决这个问题,我很乐意听到它们。