0

我正在使用Scales 库在 Scala 中处理 XML,并且我希望在解析期间扩展xi:include元素。这在默认情况下不会发生 - 例如,如果我编写以下内容,includeXML 文件中的任何元素都将在解析的文档中显示为未展开:

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。

4

1 回答 1

1

是的!至少这是可能的。您可以在提供的模型上编写自己的SAXParserFactoryDefaultSAXParserFactoryPool

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 hrefs 中有相对 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 中工作。

如果有更好的方法来解决这个问题,我很想听听。

于 2014-04-08T19:16:52.810 回答