2012-07-03 11 views
17

Chciałbym od czasu do czasu zignorować specyfikację dtd podczas parsowania pliku xml przy użyciu Scala. Wiem, że można to zrobić bardzo łatwo za pomocą interfejsu java wykonującIgnoruj ​​specyfikację DTD w 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); 

Jednak nie jestem pewien, jak to zrobić z łatwością xml biblioteki Scala. Jeśli to możliwe, chciałbym dalej używać biblioteki scala xml, ponieważ jest znacznie lepsza.

Z góry dziękuję!

Odpowiedz

11

To działa dla mnie, ale to zależy od implementacji parsera 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() 
    } 
} 

Zobacz także this question, co jest naprawdę, ale Twoje pytanie sformułowane w nieprzyjaznym sposób.

+0

Podoba mi się to rozwiązanie! I wow, to było naprawdę wrogie pytanie. – fozziethebeat

+6

Przyjemne podejście, chociaż odkryłem, że to nie działa dla mnie, ponieważ nie działa, gdy znajduje DTD, zamiast po prostu go ignorować (może być zależne od implementacji, jak zauważyłeś). Zauważyłem, że to jednak wystarczyło: 'f.setValidating (false); f.setFeature ("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); ' –

+0

@strangefeatures Dzięki. to pomogło. – Jus12

1

Po pierwsze, nie jestem ekspertem od XML. Więc to tylko zgadywanie ...

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

Pierwsza odpowiedź nie działa, gdy mamy niepoprawny DOCTYPE w pliku xml. Moje rozwiązanie to:

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

Dzięki. To jest odpowiedź, która naprawiła moją konkretną wersję tego problemu. Zaakceptowany na stronie daje mi SAXParseExceptions z 'DOCTYPE jest niedozwolone, gdy funkcja" http://apache.org/xml/features/disallow-doctype-decl "ustawiona na true'. Domyślam się, że XML, z którym pracował plakat, nie zawiera deklaracji DOCTYPE. Mój je miał, ale DTD nie zostało dostarczone/nie było we właściwym miejscu/nie było potrzebne. – AndrewO

Powiązane problemy