Игнорировать спецификацию 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, поскольку это значительно лучше.
Спасибо заранее!
Ответы
Ответ 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)