2012-07-03 16 views
17

Me gustaría ignorar ocasionalmente la especificación dtd al analizar un archivo xml utilizando Scala. Sé que esto se puede hacer muy fácilmente con la interfaz Java haciendoIgnorar la especificación DTD en scala

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 usando la biblioteca scala xml, ya que es significativamente mejor.

¡Gracias de antemano!

Respuesta

11

Esto funciona para mí, 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() 
    } 
} 

Ver también this question, que es realmente su pregunta, pero redactada de una manera hostil.

+0

Me gusta esta solución. Y wow, esa fue una pregunta realmente hostil. – fozziethebeat

+6

Buen enfoque, aunque encontré que esto no funcionó para mí, ya que falla cuando encuentra una DTD, en lugar de simplemente ignorarla (podría ser dependiente de la implementación, como puede ver). Descubrí que esto sí funcionaba: 'f.setValidating (false); f.setFeature ("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); ' –

+0

@strangefeatures Gracias. eso ayudó. – Jus12

1

Primero, no soy un experto en XML. Así que esto es solo una conjetura ...

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

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

Gracias. Esta es la respuesta que solucionó mi versión particular de este problema. El aceptado en me da SAXParseExceptions con 'DOCTYPE no se permite cuando la función" http://apache.org/xml/features/disallow-doctype-decl "se establece en true'. Supongo que el XML con el que el póster estaba trabajando no tenía declaraciones DOCTYPE. El mío los tenía, pero el DTD no se proporcionó/​​no estaba en el lugar correcto/no fue necesario. – AndrewO

Cuestiones relacionadas