在使用Scala解析xml文件时,我偶尔会忽略dtd规范。我知道通过执行
可以很容易地通过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库,因为它明显更好。
提前致谢!
答案 0 :(得分: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,这是你的问题,但是却以敌对的方式措辞。
答案 1 :(得分: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()
}
}
答案 2 :(得分:1)
首先,我不是XML专家。所以这只是一些猜测...
val f = javax.xml.parsers.SAXParserFactory.newInstance()
f.setValidating(false)
val p = f.newSAXParser()
val doc = xml.XML.withSAXParser(p).load(url)