xml scala dtd

xml - Ignorar especificación DTD en Scala



(3)

Me gustaría ocasionalmente ignorar la especificación de dtd al analizar un archivo xml usando Scala. Sé que esto se puede hacer con bastante facilidad con la interfaz Java haciendo

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);

Sin embargo, no estoy seguro de cómo hacer esto fácilmente con la biblioteca xml de Scala. Si es posible, me gustaría continuar utilizando la biblioteca xml de Scala, ya que es significativamente mejor.

¡Gracias por adelantado!


Esto me funciona, pero depende de la implementación del analizador 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() } }

Vea también esta pregunta , que es realmente su pregunta pero redactada de manera hostil.


La primera respuesta no funciona cuando tenemos DOCTYPE incorrecto en el archivo xml. Mi solución es:

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() } }


Primero, no soy un experto en XML. Así que esto es sólo algunas conjeturas ...

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