如何使用Scala验证XML文件的架构?
发布时间:2020-12-16 19:09:31 所属栏目:安全 来源:网络整理
导读:我写了一个微不足道的 scala程序来打开一个 XML文件. 有没有办法让scala根据引用的模式文件验证XML文件?目前,我的XML文件不遵循模式,所以我期望得到验证错误. XML文件在根元素中引用了这样的模式: items xmlns:xsi="http://www.w3.org/2001/XMLSchema-inst
我写了一个微不足道的
scala程序来打开一个
XML文件.
有没有办法让scala根据引用的模式文件验证XML文件?目前,我的XML文件不遵循模式,所以我期望得到验证错误. XML文件在根元素中引用了这样的模式: <items xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="items.xsd"> 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) 解决方法
以下是一篇博客文章,介绍如何在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] } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |