为什么我的 scala 程序没有忽略我的 xml 文件的 DTD?

Why is my scala program not ignoring my xml file's DTD?

我有一个 XML 文件,其中包含以下代码

   <Root>
    <!DOCTYPE stylesheet [
<!ENTITY CLARK_HISTORICAL_ALLOCATION_CLASS "location.stuff.things">
<!ENTITY CLARK_UNIFORM_ALLOCATION_CLASS "location.stuff.items">
<!ENTITY CLARK_PSEUDO_UNIFORM_ALLOCATION_CLASS "location.items.stuff">
]>
     <ServerConfig>
       <host name="allen" env="flat"/>
     </ServerConfig>
     <ClientConfig>
       <host name="george" env="flat"/>
       <host name="alice" env="flat"/>
       <host name="bernice" env="flat"/>
    </ClientConfig>
   </Root>

我的代码尝试忽略 DTD,并通过将文件作为文件输入流读入来向文件的 ClientConfig 部分添加一个节点,如下所示:

   val factory = javax.xml.parsers.SAXParserFactory.newInstance()
    factory.setValidating(false)
    factory.setFeature("http://xml.org/sax/features/validation", false)
    factory.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false)
    factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false)
    factory.setFeature("http://xml.org/sax/features/external-general-entities", false)
    factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false)
    val data = scala.xml.XML.withSAXParser(factory.newSAXParser).load(FileInputstream)
    val p = new XMLPrettyPrinter
    val added = addNewEntry(data, "bob", "flat")

  def toBeAddedEntry(name: String, env: String) = <host name={ name } env={ env } />
  def addNewEntry(originalXML: Elem, name: String, env: String) = {
    originalXML match {
      case e @ Elem(_, _, _, _, configs @ _*) => {
        val changedNodes = configs.map {
          case <ClientConfig>{ innerConfigs @ _* }</ClientConfig> => {
            <ClientConfig> { toBeAddedEntry(name, env) ++ innerConfigs }</ClientConfig>
          }
          case other => other
        }
        e.copy(child = changedNodes)
      }
      case _ => originalXML
    }
  }
p.write(added)(System.out)

然而,尽管添加了所有这些,DTD 并没有最终被 XML 解析器忽略,并最终在 XML 文件中成为 expanded/resolved。 为什么 DTD 没有被忽略?

我还想添加我点击这些链接以忽略我的 DTD:

Ignore DTD specification in scala

Turn off DTD validation for scala.xml.XML

这对我有用:

object MyXML extends XMLLoader[Elem] {
  override def parser: SAXParser = {
    val f = javax.xml.parsers.SAXParserFactory.newInstance()
    f.setValidating(false)
    f.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false)
    f.newSAXParser()
  }
}

val data = MyXML.load(someXML)