Проверка XSD: как получить имя текущего узла при возникновении исключения - PullRequest
0 голосов
/ 31 октября 2018

Я выполняю проверку xsd и пытаюсь получить имя текущего узла при возникновении исключения, но я получаю null

Я попробовал код ниже -

import javax.xml.transform.stream.StreamSource
import javax.xml.validation.SchemaFactory
import org.xml.sax.SAXException
import scala.xml.Elem

object Validator {
 def main(args: Array[String]) {
  val result =
    if (validate("students.xml", "students.xsd"))
      "Valid!"
    else
      "Not valid."
  println(result)
}

def validate(xmlFile: String, xsdFile: String): Boolean = {
  val schemaLang = "http://www.w3.org/2001/XMLSchema"
  val factory = SchemaFactory.newInstance(schemaLang)
  val schema = factory.newSchema(new StreamSource(xsdFile))
  val validator = schema.newValidator()
  try {
    validator.validate(new StreamSource(xmlFile))
  } catch {
    case ex: SAXException => println(ex.getMessage)
      val msg:Elem= validator.getProperty("http://apache.org/xml/properties/dom/current-element-node").asInstanceOf[Elem]
      println("Current Node - "+msg)
      return false

    case ex: Exception => println(ex.getStackTrace)
  }
  true
 }
}

Выход:

cvc-datatype-valid.1.2.1: 'Dinkar' is not a valid value for 'integer'.
Current Node - null
Not valid.

Пожалуйста, помогите мне в этом, чтобы сделать это. Спасибо!

1 Ответ

0 голосов
/ 01 ноября 2018

Это интересная идея, но невозможно получить scala.xml.Elem из javax.xml.validation.Validator при сбое проверки, так как javax ничего не знает о scala.xml. Было бы неплохо, если бы его можно было просто вызвать с помощью asInstanceOf[Elem], но для этого нужно было бы изменить класс типа Elem во время выполнения.

...