gpt4 book ai didi

xml - 如何使用 Scala 验证 XML 文件的模式?

转载 作者:数据小太阳 更新时间:2023-10-29 01:42:22 24 4
gpt4 key购买 nike

我编写了一个简单的 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]
}
}

关于xml - 如何使用 Scala 验证 XML 文件的模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1627111/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com