@@ -14,7 +14,7 @@ package scala
1414package xml
1515package factory
1616
17- import org .xml .sax .SAXNotRecognizedException
17+ import org .xml .sax .{ SAXNotRecognizedException , XMLReader }
1818import javax .xml .parsers .SAXParserFactory
1919import parsing .{FactoryAdapter , NoBindingFactoryAdapter }
2020import java .io .{File , FileDescriptor , InputStream , Reader }
@@ -46,59 +46,77 @@ trait XMLLoader[T <: Node] {
4646 /* Override this to use a different SAXParser. */
4747 def parser : SAXParser = parserInstance.get
4848
49+ /* Override this to use a different XMLReader. */
50+ def reader : XMLReader = parser.getXMLReader
51+
4952 /**
5053 * Loads XML from the given InputSource, using the supplied parser.
5154 * The methods available in scala.xml.XML use the XML parser in the JDK.
5255 */
53- def loadXML (source : InputSource , parser : SAXParser ): T = {
54- val result : FactoryAdapter = parse(source, parser)
56+ def loadXML (source : InputSource , parser : SAXParser ): T = loadXML(source, parser.getXMLReader)
57+
58+ def loadXMLNodes (source : InputSource , parser : SAXParser ): Seq [Node ] = loadXMLNodes(source, parser.getXMLReader)
59+
60+ private def loadXML (source : InputSource , reader : XMLReader ): T = {
61+ val result : FactoryAdapter = parse(source, reader)
5562 result.rootElem.asInstanceOf [T ]
5663 }
57-
58- def loadXMLNodes (source : InputSource , parser : SAXParser ): Seq [Node ] = {
59- val result : FactoryAdapter = parse(source, parser )
64+
65+ private def loadXMLNodes (source : InputSource , reader : XMLReader ): Seq [Node ] = {
66+ val result : FactoryAdapter = parse(source, reader )
6067 result.prolog ++ (result.rootElem :: result.epilogue)
6168 }
6269
63- private def parse (source : InputSource , parser : SAXParser ): FactoryAdapter = {
70+ private def parse (source : InputSource , reader : XMLReader ): FactoryAdapter = {
71+ if (source == null ) throw new IllegalArgumentException (" InputSource cannot be null" )
72+
6473 val result : FactoryAdapter = adapter
6574
75+ reader.setContentHandler(result)
76+ reader.setDTDHandler(result)
77+ /* Do not overwrite pre-configured EntityResolver. */
78+ if (reader.getEntityResolver == null ) reader.setEntityResolver(result)
79+ /* Do not overwrite pre-configured ErrorHandler. */
80+ if (reader.getErrorHandler == null ) reader.setErrorHandler(result)
81+
6682 try {
67- parser .setProperty(" http://xml.org/sax/properties/lexical-handler" , result)
83+ reader .setProperty(" http://xml.org/sax/properties/lexical-handler" , result)
6884 } catch {
6985 case _ : SAXNotRecognizedException =>
7086 }
7187
7288 result.scopeStack = TopScope :: result.scopeStack
73- parser .parse(source, result )
89+ reader .parse(source)
7490 result.scopeStack = result.scopeStack.tail
7591
7692 result
7793 }
7894
95+ /** loads XML from given InputSource. */
96+ def load (source : InputSource ): T = loadXML(source, reader)
97+
7998 /** Loads XML from the given file, file descriptor, or filename. */
80- def loadFile (file : File ): T = loadXML (fromFile(file), parser )
81- def loadFile (fd : FileDescriptor ): T = loadXML (fromFile(fd), parser )
82- def loadFile (name : String ): T = loadXML (fromFile(name), parser )
99+ def loadFile (file : File ): T = load (fromFile(file))
100+ def loadFile (fd : FileDescriptor ): T = load (fromFile(fd))
101+ def loadFile (name : String ): T = load (fromFile(name))
83102
84- /** loads XML from given InputStream, Reader, sysID, InputSource, or URL. */
85- def load (is : InputStream ): T = loadXML(fromInputStream(is), parser)
86- def load (reader : Reader ): T = loadXML(fromReader(reader), parser)
87- def load (sysID : String ): T = loadXML(fromSysId(sysID), parser)
88- def load (source : InputSource ): T = loadXML(source, parser)
89- def load (url : URL ): T = loadXML(fromInputStream(url.openStream()), parser)
103+ /** loads XML from given InputStream, Reader, sysID, or URL. */
104+ def load (is : InputStream ): T = load(fromInputStream(is))
105+ def load (reader : Reader ): T = load(fromReader(reader))
106+ def load (sysID : String ): T = load(fromSysId(sysID))
107+ def load (url : URL ): T = load(fromInputStream(url.openStream()))
90108
91109 /** Loads XML from the given String. */
92- def loadString (string : String ): T = loadXML (fromString(string), parser )
110+ def loadString (string : String ): T = load (fromString(string))
93111
94112 /** Load XML nodes, including comments and processing instructions that precede and follow the root element. */
95- def loadFileNodes ( file : File ): Seq [Node ] = loadXMLNodes(fromFile(file), parser )
96- def loadFileNodes (fd : FileDescriptor ): Seq [Node ] = loadXMLNodes (fromFile(fd), parser )
97- def loadFileNodes (name : String ): Seq [Node ] = loadXMLNodes (fromFile(name), parser )
98- def loadNodes ( is : InputStream ): Seq [Node ] = loadXMLNodes(fromInputStream(is), parser )
99- def loadNodes (reader : Reader ): Seq [Node ] = loadXMLNodes(fromReader(reader), parser )
100- def loadNodes (sysID : String ): Seq [Node ] = loadXMLNodes(fromSysId(sysID), parser )
101- def loadNodes (source : InputSource ): Seq [Node ] = loadXMLNodes(source, parser )
102- def loadNodes (url : URL ): Seq [Node ] = loadXMLNodes (fromInputStream(url.openStream()), parser )
103- def loadStringNodes (string : String ): Seq [Node ] = loadXMLNodes (fromString(string), parser )
113+ def loadNodes ( source : InputSource ): Seq [Node ] = loadXMLNodes(source, reader )
114+ def loadFileNodes (file : File ): Seq [Node ] = loadNodes (fromFile(file) )
115+ def loadFileNodes (fd : FileDescriptor ): Seq [Node ] = loadNodes (fromFile(fd) )
116+ def loadFileNodes ( name : String ): Seq [Node ] = loadNodes(fromFile(name) )
117+ def loadNodes (is : InputStream ): Seq [Node ] = loadNodes(fromInputStream(is) )
118+ def loadNodes (reader : Reader ): Seq [Node ] = loadNodes(fromReader(reader) )
119+ def loadNodes (sysID : String ): Seq [Node ] = loadNodes(fromSysId(sysID) )
120+ def loadNodes (url : URL ): Seq [Node ] = loadNodes (fromInputStream(url.openStream()))
121+ def loadStringNodes (string : String ): Seq [Node ] = loadNodes (fromString(string))
104122}
0 commit comments