@@ -14,7 +14,7 @@ package scala
14
14
package xml
15
15
package factory
16
16
17
- import org .xml .sax .SAXNotRecognizedException
17
+ import org .xml .sax .{ SAXNotRecognizedException , XMLReader }
18
18
import javax .xml .parsers .SAXParserFactory
19
19
import parsing .{FactoryAdapter , NoBindingFactoryAdapter }
20
20
import java .io .{File , FileDescriptor , InputStream , Reader }
@@ -46,59 +46,77 @@ trait XMLLoader[T <: Node] {
46
46
/* Override this to use a different SAXParser. */
47
47
def parser : SAXParser = parserInstance.get
48
48
49
+ /* Override this to use a different XMLReader. */
50
+ def reader : XMLReader = parser.getXMLReader
51
+
49
52
/**
50
53
* Loads XML from the given InputSource, using the supplied parser.
51
54
* The methods available in scala.xml.XML use the XML parser in the JDK.
52
55
*/
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)
55
62
result.rootElem.asInstanceOf [T ]
56
63
}
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 )
60
67
result.prolog ++ (result.rootElem :: result.epilogue)
61
68
}
62
69
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
+
64
73
val result : FactoryAdapter = adapter
65
74
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
+
66
82
try {
67
- parser .setProperty(" http://xml.org/sax/properties/lexical-handler" , result)
83
+ reader .setProperty(" http://xml.org/sax/properties/lexical-handler" , result)
68
84
} catch {
69
85
case _ : SAXNotRecognizedException =>
70
86
}
71
87
72
88
result.scopeStack = TopScope :: result.scopeStack
73
- parser .parse(source, result )
89
+ reader .parse(source)
74
90
result.scopeStack = result.scopeStack.tail
75
91
76
92
result
77
93
}
78
94
95
+ /** loads XML from given InputSource. */
96
+ def load (source : InputSource ): T = loadXML(source, reader)
97
+
79
98
/** 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))
83
102
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()))
90
108
91
109
/** 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))
93
111
94
112
/** 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))
104
122
}
0 commit comments