diff options
Diffstat (limited to 'lib/xmlrpc')
-rw-r--r-- | lib/xmlrpc/config.rb | 1 | ||||
-rw-r--r-- | lib/xmlrpc/parser.rb | 34 |
2 files changed, 34 insertions, 1 deletions
diff --git a/lib/xmlrpc/config.rb b/lib/xmlrpc/config.rb index 98081473b4..7923f3a26e 100644 --- a/lib/xmlrpc/config.rb +++ b/lib/xmlrpc/config.rb @@ -18,6 +18,7 @@ module XMLRPC # :nodoc: # * XMLParser::XMLStreamParser (fastest) # * XMLParser::REXMLStreamParser # * XMLParser::XMLScanStreamParser + # * XMLParser::LibXMLStreamParser DEFAULT_PARSER = XMLParser::REXMLStreamParser # enable <code><nil/></code> tag diff --git a/lib/xmlrpc/parser.rb b/lib/xmlrpc/parser.rb index 0afbd07e6b..be8accfd6b 100644 --- a/lib/xmlrpc/parser.rb +++ b/lib/xmlrpc/parser.rb @@ -814,12 +814,44 @@ module XMLRPC # :nodoc: end end + class LibXMLStreamParser < AbstractStreamParser + def initialize + require 'libxml' + @parser_class = LibXMLStreamListener + end + + class LibXMLStreamListener + include StreamParserMixin + + def on_start_element_ns(name, attributes, prefix, uri, namespaces) + startElement(name) + end + + def on_end_element_ns(name, prefix, uri) + endElement(name) + end + + alias :on_characters :character + alias :on_cdata_block :character + + def method_missing(*a) + end + + def parse(str) + parser = LibXML::XML::SaxParser.string(str) + parser.callbacks = self + parser.parse() + end + end + end + XMLParser = XMLTreeParser NQXMLParser = NQXMLTreeParser Classes = [XMLStreamParser, XMLTreeParser, NQXMLStreamParser, NQXMLTreeParser, - REXMLStreamParser, XMLScanStreamParser] + REXMLStreamParser, XMLScanStreamParser, + LibXMLStreamParser] # yields an instance of each installed parser def self.each_installed_parser |