我使用尺度库在Scala中处理XML,我希望在解析过程中扩展元素。这在默认情况下不会发生--例如,如果我编写以下内容,那么XML文件中的任何include元素都将在解析的文档中显示为未展开:
import java.io.FileReader
import scales.utils._, ScalesUtils._
import scales.xml._, ScalesXml._
val doc = loadXml(new FileReader("data/example.xml"))是否有可能扩大这些要素?我用的是标尺0.6.0-M1。
发布于 2014-04-08 19:16:52
是!至少这是可能的。您可以在提供的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
)注意,如果您的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中工作。
如果有更好的方法来解决这个问题,我很想听听。
https://stackoverflow.com/questions/22946053
复制相似问题