Class: PseudoXml::XPathQuery

Inherits:
Collector show all
Defined in:
lib/pseudo_xml/xpath_query.rb

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Collector

#add_text, #nodes

Constructor Details

#initialize(xpath, &b) ⇒ XPathQuery

Returns a new instance of XPathQuery.



17
18
19
20
21
22
23
# File 'lib/pseudo_xml/xpath_query.rb', line 17

def initialize(xpath, &b)
  @parsed_elements = []
  @current_path = []
  @xpath = xpath.split('/')
  @xpath.shift if @xpath.first == ''
  @block = b
end

Class Method Details

.find(xml, xpath, &b) ⇒ Object



10
11
12
13
14
15
# File 'lib/pseudo_xml/xpath_query.rb', line 10

def self.find(xml, xpath, &b)
  parser = XmlString.new(xml)
  collector = self.new(xpath, &b)
  
  parser.parse(collector)
end

Instance Method Details

#end_elementObject



43
44
45
46
47
48
49
50
51
52
53
# File 'lib/pseudo_xml/xpath_query.rb', line 43

def end_element
  
  @current_path.pop
  
  if @parsed_elements.size > 1
    node = @parsed_elements.pop
    @parsed_elements.last.elements << node
  elsif @parsed_elements.size == 1
    @block.call(@parsed_elements.pop)
  end      
end

#start_element(element_text) ⇒ Object



25
26
27
28
29
30
31
32
33
# File 'lib/pseudo_xml/xpath_query.rb', line 25

def start_element(element_text)
  element_name = element_text[/\w+/]
  
  @current_path.push element_name
  
  if @parsed_elements.size > 1 || xpath_match?
    @parsed_elements.push Element.new(element_text[/\w+/])
  end
end

#xpath_match?Boolean

Returns:

  • (Boolean)


35
36
37
38
39
40
41
# File 'lib/pseudo_xml/xpath_query.rb', line 35

def xpath_match?
  @xpath.size.times do |i|
    return false unless @xpath[i] == '*' || @xpath[i] == @current_path[i]
  end
  
  return true
end