Игнорировать спецификацию DTD в scala - программирование

Игнорировать спецификацию DTD в scala

Я хотел бы иногда игнорировать спецификацию dtd при анализе xml файла с помощью Scala. Я знаю, что это можно сделать довольно легко с помощью интерфейса java, выполнив

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

dbf.setValidating(false);
dbf.setFeature("http://xml.org/sax/features/namespaces", false);
dbf.setFeature("http://xml.org/sax/features/validation", false);
dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false);
dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);

Однако я не уверен, как это сделать с помощью библиотеки Scala xml. Если возможно, я бы хотел продолжить использование библиотеки Scala xml, поскольку это значительно лучше.

Спасибо заранее!

4b9b3361

Ответ 1

Это работает для меня, но это зависит от реализации парсера XML.

import scala.xml.Elem
import scala.xml.factory.XMLLoader
import javax.xml.parsers.SAXParser
object MyXML extends XMLLoader[Elem] {
  override def parser: SAXParser = {
    val f = javax.xml.parsers.SAXParserFactory.newInstance()
    f.setNamespaceAware(false)
    f.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
    f.newSAXParser()
  }
}

См. также этот вопрос, который действительно является вашим вопросом, но сформулирован враждебно.

Ответ 2

Первый ответ не работает, когда у нас есть неправильный DOCTYPE в xml файле. Мое решение:

import scala.xml.Elem
import scala.xml.factory.XMLLoader
import javax.xml.parsers.SAXParser
object XML extends XMLLoader[Elem] {
  override def parser: SAXParser = {
    val f = javax.xml.parsers.SAXParserFactory.newInstance()
    f.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false);
    f.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
    f.newSAXParser()
  }
}

Ответ 3

Во-первых, я не эксперт по XML. Так что это всего лишь некоторые догадки...

val f = javax.xml.parsers.SAXParserFactory.newInstance()
f.setValidating(false)
val p = f.newSAXParser()
val doc = xml.XML.withSAXParser(p).load(url)