我写了一个简单的scala程序来打开一个XML文件.
有没有办法让scala根据它引用的模式文件验证XML文件?目前我的XML文件不遵循架构,所以我希望在验证时出错.
XML文件在根元素中引用这样的模式:
<items xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="items.xsd">
Run Code Online (Sandbox Code Playgroud)
scala代码:
import scala.xml._
object HelloWorld {
def main(args: Array[String]) {
println("Hello, world! " + args.toList)
val start = System.currentTimeMillis
val data = XML.loadFile(args(0))
val stop = System.currentTimeMillis
Console.println("Took " + (stop-start)/1000.0 + "s to load " + args(0))
}
}
HelloWorld.main(args)
Run Code Online (Sandbox Code Playgroud)
这是一篇博客文章,描述了如何在Scala中使用Java库进行模式验证:
http://sean8223.blogspot.com/2009/09/xsd-validation-in-scala.html
它归结为基本的重新实现XML.load:
import javax.xml.parsers.SAXParser
import javax.xml.parsers.SAXParserFactory
import javax.xml.validation.Schema
import javax.xml.validation.ValidatorHandler
import org.xml.sax.XMLReader
class SchemaAwareFactoryAdapter(schema:Schema) extends NoBindingFactoryAdapter {
override def loadXML(source: InputSource): Elem = {
// create parser
val parser: SAXParser = try {
val f = SAXParserFactory.newInstance()
f.setNamespaceAware(true)
f.setFeature("http://xml.org/sax/features/namespace-prefixes", true)
f.newSAXParser()
} catch {
case e: Exception =>
Console.err.println("error: Unable to instantiate parser")
throw e
}
val xr = parser.getXMLReader()
val vh = schema.newValidatorHandler()
vh.setContentHandler(this)
xr.setContentHandler(vh)
// parse file
scopeStack.push(TopScope)
xr.parse(source)
scopeStack.pop
return rootElem.asInstanceOf[Elem]
}
}
Run Code Online (Sandbox Code Playgroud)