2012-07-03 41 views
17

我想在使用Scala解析xml文件時偶爾忽略dtd規範。我知道,這是可以很容易地使用Java界面做忽略scala中的DTD規範

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庫,因爲它顯着更好。

在此先感謝!

回答

11

這適用於我,但它取決於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() 
    } 
} 

另請參閱this question,這實際上是你的問題,但措辭以敵對的方式。

+0

我喜歡這個解決方案!哇,那真是一個非常敵對的問題。 – fozziethebeat

+6

好方法,雖然我發現這對我沒有用,因爲它發現DTD時失敗,而不是忽略它(可能與實現有關)。我發現這樣做了:'f.setValidating(false); f.setFeature(「http://apache.org/xml/features/nonvalidating/load-external-dtd」,false);' –

+0

@strangefeatures謝謝。這有幫助。 – Jus12

1

首先,我不是XML專家。所以這只是一些猜測...

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

當我們在xml文件中有不正確的DOCTYPE時,第一個答案不起作用。 我的解決方案是:

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

謝謝。這是解決此問題的特定版本的答案。 接受的on給了我SAXParseExceptions與'DOCTYPE不允許功能「http://apache.org/xml/features/disallow-doctype-decl」設置爲true「。我的猜測是,海報正在使用的XML沒有DOCTYPE聲明。我有他們,但DTD沒有提供/不在正確的地方/不需要。 – AndrewO