Ticket #30 (closed defect: fixed)

Opened 5 years ago

Last modified 4 years ago

Xpath parser bug causing each_element('tag') to fail.

Reported by: lucas@… Owned by: ser
Priority: high Milestone: 3.1.4
Component: DOM Version: 3.1.2
Severity: major Keywords:
Cc: Ruby version: 1.8.2
Operating system: Linux

Description (last modified by ser) (diff)

test case :

  def test_xpathbug
    require 'rexml/document'
    d = REXML::Document.new("<tag1 xmlns='ns1'><tag2 xmlns='ns2'/><tada>xa</tada></tag1>")
    x = d.root
    num = 0
    x.each_element('tada') {  num += 1 }
    assert_equal(1, num)
  end

The bug is located in the XPathParser class, method expr, in the :qname case. This version fixes it :

        when :qname
          #puts "IN QNAME"
          prefix = path_stack.shift
          name = path_stack.shift
          default_ns = @namespaces[prefix]
          default_ns = default_ns ? default_ns : ''
          nodeset.delete_if do |node|
            ns = default_ns
            # FIXME: This DOUBLES the time XPath searches take
            ns = node.namespace( prefix ) if node.node_type == :element and ns == ''
            #puts "NS = #{ns.inspect}"
            #puts "node.node_type == :element => #{node.node_type == :element}"
            if node.node_type == :element
              #puts "node.name == #{name} => #{node.name == name}"
              if node.name == name
                #puts "node.namespace == #{ns.inspect} => #{node.namespace == ns}"
              end
            end
            !(node.node_type == :element and 
              node.name == name and 
              node.namespace == ns )
          end
          node_types = ELEMENTS

Change History

Changed 5 years ago by ser

  • description modified (diff)

Changed 5 years ago by ser

  • status changed from new to assigned

Changed 5 years ago by ser

  • status changed from assigned to closed
  • resolution set to fixed

The fix is good, and has been applied. See changeset:1139

Note: See TracTickets for help on using tickets.