【问题标题】:Ignore DTD specification in scala忽略scala中的DTD规范
【发布时间】:2012-07-04 03:39:07
【问题描述】:

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

提前致谢!

【问题讨论】:

    标签: xml scala dtd


    【解决方案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 解析器的实现。

      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,这确实是您的问题,但措辞带有敌意。

      【讨论】:

      • 我喜欢这个解决方案!哇,这真是一个充满敌意的问题。
      • 不错的方法,尽管我发现这对我不起作用,因为它在找到 DTD 时失败,而不是仅仅忽略它(可能取决于实现,如您所述)。我发现这确实有效:f.setValidating(false); f.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
      • @strangefeatures 谢谢。这有帮助。
      【解决方案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()
        }
      }
      

      【讨论】:

      • 谢谢。这是解决我这个问题的特定版本的答案。接受的 on 给了我带有DOCTYPE is disallowed when the feature "http://apache.org/xml/features/disallow-doctype-decl" set to true 的 SAXParseExceptions。我的猜测是张贴者使用的 XML 没有 DOCTYPE 声明。我的有,但没有提供 DTD/不在正确的位置/不需要。
      最近更新 更多