XInclude和Scales XML

时间:2014-04-08 19:06:13

标签: xml scala xml-parsing xinclude scales-xml

我使用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。

1 个答案:

答案 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中工作。

如果有更好的方法可以解决这个问题,我很乐意听到它们。