我一直在尝试让scala的xml解析来允许我设置EntityResolver。
我做错了什么,但是我找不到实质性的文档。将scala的解析器指向dtd文件的正确位置的正确方法是什么?
object MyXML {
def loadFile(file: File): Node = {
println("loadFile called")
val parser: SAXParser = scala.xml.XML.parser
parser.getParser.setEntityResolver(new MyXMLEntityResolver)
// Also tried: parser.getXMLReader.setEntityResolver...
val inputSource = new InputSource(file.getAbsolutePath)
val loader = scala.xml.XML.withSAXParser(parser)
loader.loadFile(file)
//scala.xml.XML.loadXML(inputSource, parser)
}
class MyXMLEntityResolver extends EntityResolver {
override def resolveEntity(publicId: String, systemId: String): InputSource = {
println("Resolve called!")
new InputSource(systemId)
}
}
}
// prints only "loadFile called"发布于 2015-03-19 06:42:31
答案是,要覆盖的重要内容是XMLLoader[T]中的adapter方法,它具有执行正确解析的适配器,而不是设置parser方法的EntityResolver (即使覆盖它也不起作用!)
所以,我有一个这样的类,它似乎可以解决这个问题
class MyXMLParser extends XMLLoader[Elem] {
override def adapter = {
new MyXMLAdapter
}
}
class PhysicsXMLAdapter extends NoBindingFactoryAdapter {
val myEntityResolver = new MyEntityResolver
override def resolveEntity(publicId: String, systemId: String): InputSource = {
myEntityResolver.resolveEntity(publicId, systemId)
}
}https://stackoverflow.com/questions/29105324
复制相似问题