忽略scala中的DTD规范

foz*_*eat 17 xml dtd scala

我想在使用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);
Run Code Online (Sandbox Code Playgroud)

但是,我不确定如何使用Scala的xml库轻松完成此操作.如果可能的话,我想继续使用scala xml库,因为它明显更好.

提前致谢!

Dan*_*ral 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()
  }
}
Run Code Online (Sandbox Code Playgroud)

另见这个问题,这是你的问题,但是以敌对的方式措辞.

  • 很好的方法,虽然我发现这对我不起作用,因为它在找到DTD时失败,而不是忽略它(可能与实现有关,正如你所注意到的).我发现这可以解决这个问题:`f.setValidating(false); f.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd",false);` (7认同)