0

Scales ライブラリを使用してScala で XML を処理していますが、解析中にxi:include要素を展開したいと考えています。これはデフォルトでは発生しません。たとえば、次のように記述した場合include、XML ファイル内のすべての要素が、解析されたドキュメント内で展開されずに表示されます。

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

はい!少なくとも可能です。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 で動作するはずです。

この問題を解決するためのより良い方法があれば、ぜひ聞いてみたいです。

于 2014-04-08T19:16:52.810 に答える