忽略scala中的DTD规范

时间:2012-07-03 16:44:20

标签: xml scala dtd

在使用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库,因为它明显更好。

提前致谢!

3 个答案:

答案 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)