加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何使用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]
  }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读