17

在使用 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 库,因为它要好得多。

提前致谢!

4

3 回答 3

12

这对我有用,但它取决于 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,这确实是您的问题,但措辞敌对。

于 2012-07-03T17:39:47.123 回答
3

当我们在 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()
  }
}
于 2015-10-24T22:07:18.740 回答
1

首先,我不是 XML 专家。所以这只是一些猜测......

val f = javax.xml.parsers.SAXParserFactory.newInstance()
f.setValidating(false)
val p = f.newSAXParser()
val doc = xml.XML.withSAXParser(p).load(url)
于 2012-07-03T17:19:36.480 回答