关闭scala.xml.xml的DTD验证

关闭scala.xml.xml的DTD验证,xml,scala,dtd,saxparser,Xml,Scala,Dtd,Saxparser,我想从Scala中的InputStream加载XML文档。因此,我使用的是scala.xml.xml.load(is:InputStream):scala.xml.Elem XML文档是一个来自Potrace的SVG文件,如下所示: <?xml version="1.0" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" "http://www.w3.org/TR/2001/REC-SV

我想从Scala中的
InputStream
加载XML文档。因此,我使用的是
scala.xml.xml.load(is:InputStream):scala.xml.Elem

XML文档是一个来自Potrace的SVG文件,如下所示:

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
 "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
 width="10.000000pt" height="10.000000pt" viewBox="0 0 10.000000 10.000000"
 preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.11, written by Peter Selinger 2001-2013
</metadata>
<g transform="translate(0.000000,10.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M14 73 c2 -10 11 -20 20 -21 13 -3 17 2 14 14 -4 25 -37 31 -34 7z"/>
<path d="M67 83 c-4 -3 -7 -15 -7 -25 0 -13 -7 -18 -26 -18 -14 0 -23 -4 -19
-10 17 -28 75 9 75 47 0 14 -12 17 -23 6z"/>
<path d="M74 21 c-5 -5 -22 -11 -39 -14 -27 -4 -27 -4 7 -6 20 0 40 4 43 10 9
14 1 21 -11 10z"/>
</g>
</svg>

由Peter Selinger 2001-2013编写的potrace 1.11创建
我的问题是,解析InputStream大约需要15秒,这很烦人

我发现,从文件中删除
时没有延迟。因此,底层的
SAXParser
可能会下载
中的DTD,以检查文档是否有效


如何配置Scala的
XML.load
(可能通过使用
XML.withSAXParser
)来不验证文档?

我自己找到了一个解决方案

val factory = javax.xml.parsers.SAXParserFactory.newInstance()

// disable DTD validation
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 elem = scala.xml.XML.withSAXParser(factory.newSAXParser).load(inputStream)

帮助我找到了解决方案。

我自己找到了解决方案

val factory = javax.xml.parsers.SAXParserFactory.newInstance()

// disable DTD validation
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 elem = scala.xml.XML.withSAXParser(factory.newSAXParser).load(inputStream)

帮助我找到解决方案。

您需要使用DTD为您使用的解析器禁用验证。以下是如何:

您需要对所使用的解析器禁用使用DTD的验证。以下是如何:

我可以确认XML.load和XML.loadString在每次解析时都在下载DTD。当托管DTD的服务器停机时,由于503个错误,我开始出现解析失败:(我可以确认XML.load和XML.loadString在每次解析时都在下载DTD。当托管DTD的服务器停机时,由于503个错误,我开始出现解析失败的情况。:(