2014-01-05 4 views
1

Я хочу загрузить XML-документ из InputStream в Scala. Поэтому я использую scala.xml.XML.load(is: InputStream): scala.xml.Elem.Отключить проверку DTD для scala.xml.XML

Документ XML представляет собой SVG-файл, который приходит из Potrace и выглядит следующим образом:

<?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> 

Моя проблема в том, что разбор InputStream занимает около 15 секунд, что раздражает.

Я понял, что нет никакой задержки, когда я удаляю <!DOCTYPE> из файла. Поэтому, возможно, базовый SAXParser загружает DTD в <!DOCTYPE>, чтобы проверить, что документ действителен.

Как настроить Scala XML.load (возможно, используя XML.withSAXParser), чтобы не подтвердить документ?

+0

Я могу подтвердить, что XML.load и XML.loadString загружают DTD при каждом анализе. Я начал получать сбои анализа из-за ошибок 503, когда сервер, на котором размещен DTD, снизился. :( – Jono

ответ

2

Я нашел решение самостоятельно.

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) 

This answer помог мне найти решение.

Смежные вопросы