Class: REXML::XPathParser
- Inherits:
-
Object
- Object
- REXML::XPathParser
- Includes:
- XMLTokens
- Defined in:
- lib/xmpp4r/rexmladdons.rb
Overview
You don’t want to use this class. Really. Use XPath, which is a wrapper for this class. Believe me. You don’t want to poke around in here. There is strange, dark magic at work in this code. Beware. Go back! Go back while you still can!
Constant Summary collapse
- ALL =
Expr takes a stack of path elements and a set of nodes (either a Parent or an Array and returns an Array of matching nodes
[ :attribute, :element, :text, :processing_instruction, :comment ]
- ELEMENTS =
[ :element ]
Instance Method Summary collapse
- #[]=(variable_name, value) ⇒ Object
-
#first(path_stack, node) ⇒ Object
Performs a depth-first (document order) XPath search, and returns the first match.
- #get_first(path, nodeset) ⇒ Object
-
#initialize ⇒ XPathParser
constructor
LITERAL = /^‘([^’]*)‘|^“([^”]*)“/u.
- #match(path_stack, nodeset) ⇒ Object
- #namespaces=(namespaces) ⇒ Object
- #parse(path, nodeset) ⇒ Object
- #predicate(path, nodeset) ⇒ Object
- #variables=(vars = {}) ⇒ Object
Constructor Details
#initialize ⇒ XPathParser
LITERAL = /^‘([^’]*)‘|^“([^”]*)“/u
128 129 130 131 132 |
# File 'lib/xmpp4r/rexmladdons.rb', line 128 def initialize( ) @parser = REXML::Parsers::XPathParser.new @namespaces = {} @variables = {} end |
Instance Method Details
#[]=(variable_name, value) ⇒ Object
166 167 168 |
# File 'lib/xmpp4r/rexmladdons.rb', line 166 def []=( variable_name, value ) @variables[ variable_name ] = value end |
#first(path_stack, node) ⇒ Object
Performs a depth-first (document order) XPath search, and returns the first match. This is the fastest, lightest way to return a single result.
173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 |
# File 'lib/xmpp4r/rexmladdons.rb', line 173 def first( path_stack, node ) #puts "#{depth}) Entering match( #{path.inspect}, #{tree.inspect} )" return nil if path.size == 0 case path[0] when :document # do nothing return first( path[1..-1], node ) when :child for c in node.children #puts "#{depth}) CHILD checking #{name(c)}" r = first( path[1..-1], c ) #puts "#{depth}) RETURNING #{r.inspect}" if r return r if r end when :qname name = path[2] #puts "#{depth}) QNAME #{name(tree)} == #{name} (path => #{path.size})" if node.name == name #puts "#{depth}) RETURNING #{tree.inspect}" if path.size == 3 return node if path.size == 3 return first( path[3..-1], node ) else return nil end when :descendant_or_self r = first( path[1..-1], node ) return r if r for c in node.children r = first( path, c ) return r if r end when :node return first( path[1..-1], node ) when :any return first( path[1..-1], node ) end return nil end |
#get_first(path, nodeset) ⇒ Object
153 154 155 156 157 158 159 |
# File 'lib/xmpp4r/rexmladdons.rb', line 153 def get_first path, nodeset #puts "#"*40 path_stack = @parser.parse( path ) #puts "PARSE: #{path} => #{path_stack.inspect}" #puts "PARSE: nodeset = #{nodeset.inspect}" first( path_stack, nodeset ) end |
#match(path_stack, nodeset) ⇒ Object
214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 |
# File 'lib/xmpp4r/rexmladdons.rb', line 214 def match( path_stack, nodeset ) #puts "MATCH: path_stack = #{path_stack.inspect}" #puts "MATCH: nodeset = #{nodeset.inspect}" r = expr( path_stack, nodeset ) #puts "MAIN EXPR => #{r.inspect}" r #while ( path_stack.size > 0 and nodeset.size > 0 ) # #puts "MATCH: #{path_stack.inspect} '#{nodeset.collect{|n|n.class}.inspect}'" # nodeset = expr( path_stack, nodeset ) # #puts "NODESET: #{nodeset.inspect}" # #puts "PATH_STACK: #{path_stack.inspect}" #end #nodeset end |
#namespaces=(namespaces) ⇒ Object
134 135 136 137 138 |
# File 'lib/xmpp4r/rexmladdons.rb', line 134 def namespaces=( namespaces ) namespaces ||= {} Functions::namespace_context = namespaces @namespaces = namespaces end |
#parse(path, nodeset) ⇒ Object
145 146 147 148 149 150 151 |
# File 'lib/xmpp4r/rexmladdons.rb', line 145 def parse path, nodeset #puts "#"*40 path_stack = @parser.parse( path ) #puts "PARSE: #{path} => #{path_stack.inspect}" #puts "PARSE: nodeset = #{nodeset.inspect}" match( path_stack, nodeset ) end |
#predicate(path, nodeset) ⇒ Object
161 162 163 164 |
# File 'lib/xmpp4r/rexmladdons.rb', line 161 def predicate path, nodeset path_stack = @parser.parse( path ) expr( path_stack, nodeset ) end |
#variables=(vars = {}) ⇒ Object
140 141 142 143 |
# File 'lib/xmpp4r/rexmladdons.rb', line 140 def variables=( vars={} ) Functions::variables = vars @variables = vars end |