2014-01-05 3 views
1

Scala의 InputStream에서 XML 문서를로드하고 싶습니다. 따라서 scala.xml.XML.load(is: InputStream): scala.xml.Elem을 사용하고 있습니다.scala.xml.XML에 대한 DTD 유효성 검사를 비활성화하십시오.

<?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 초 정도 소요된다 :

XML 문서 Potrace에서 오는이처럼 보이는 SVG 파일입니다.

나는 파일에서 <!DOCTYPE>을 삭제할 때 지연이 없다는 것을 알아 냈습니다. 그래서 아마도 SAXParser<!DOCTYPE>에 DTD를 다운로드하여 문서가 유효한지 확인합니다.

문서의 유효성을 검사하지 않기 위해 Scala의 XML.load (아마도 XML.withSAXParser을 사용하여)을 어떻게 구성 할 수 있습니까?

+0

내가 그은 XML.load를 확인할 수 있으며, XML.loadString 모든 구문 분석에 DTD를 다운로드하는 방법은 다음과 같습니다이다. DTD를 호스팅하는 서버가 다운되었을 때 503 개의 오류로 인해 구문 분석 오류가 발생하기 시작했습니다. :( – 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이 솔루션을 찾는 데 도움이되었습니다.

관련 문제