首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XInclude和Scales

XInclude和Scales
EN

Stack Overflow用户
提问于 2014-04-08 19:06:12
回答 1查看 210关注 0票数 0

我使用尺度库在Scala中处理XML,我希望在解析过程中扩展元素。这在默认情况下不会发生--例如,如果我编写以下内容,那么XML文件中的任何include元素都将在解析的文档中显示为未展开:

代码语言:javascript
复制
import java.io.FileReader
import scales.utils._, ScalesUtils._
import scales.xml._, ScalesXml._

val doc = loadXml(new FileReader("data/example.xml"))

是否有可能扩大这些要素?我用的是标尺0.6.0-M1。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-08 19:16:52

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

代码语言:javascript
复制
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调用中指定解析器池:

代码语言:javascript
复制
val doc = loadXml(
  source = new FileReader("data/example.xml"),
  parsers = XIncludeSAXParserFactoryPool.parsers
)

注意,如果您的include href中有相对URI,并且希望它们相对于文档的位置(而不是当前目录)进行评估,则需要确保InputSource获得系统ID。

代码语言:javascript
复制
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中工作。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22946053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档