diff options
-rw-r--r-- | NEWS | 6 | ||||
-rw-r--r-- | lib/rexml/element.rb | 24 | ||||
-rw-r--r-- | test/rexml/test_element.rb | 18 |
3 files changed, 48 insertions, 0 deletions
@@ -251,6 +251,12 @@ with all sufficient information, see the ChangeLog file or Redmine * Readline.quoting_detection_proc and Readline.quoting_detection_proc= [Feature #12659] +* REXML + + * REXML::Element#[]: If String or Symbol is specified, attribute + value is returned. Otherwise, Nth child is returned. This is + backward compatible change. + * set * New methods: Set#compare_by_identity and Set#compare_by_identity?. diff --git a/lib/rexml/element.rb b/lib/rexml/element.rb index f725d5a2be..a9811bcba3 100644 --- a/lib/rexml/element.rb +++ b/lib/rexml/element.rb @@ -551,6 +551,30 @@ module REXML # Attributes # ################################################# + # Fetches an attribute value or a child. + # + # If String or Symbol is specified, it's treated as attribute + # name. Attribute value as String or +nil+ is returned. This case + # is shortcut of +attributes[name]+. + # + # If Integer is specified, it's treated as the index of + # child. It returns Nth child. + # + # doc = REXML::Document.new("<a attr='1'><b/><c/></a>") + # doc.root["attr"] # => "1" + # doc.root.attributes["attr"] # => "1" + # doc.root[1] # => <c/> + def [](name_or_index) + case name_or_index + when String + attributes[name_or_index] + when Symbol + attributes[name_or_index.to_s] + else + super + end + end + def attribute( name, namespace=nil ) prefix = nil if namespaces.respond_to? :key diff --git a/test/rexml/test_element.rb b/test/rexml/test_element.rb new file mode 100644 index 0000000000..82830b44e6 --- /dev/null +++ b/test/rexml/test_element.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: false + +require "test/unit/testcase" +require "rexml/document" + +module REXMLTests + class ElementTester < Test::Unit::TestCase + def test_array_reference_string + doc = REXML::Document.new("<language name='Ruby'/>") + assert_equal("Ruby", doc.root["name"]) + end + + def test_array_reference_symbol + doc = REXML::Document.new("<language name='Ruby'/>") + assert_equal("Ruby", doc.root[:name]) + end + end +end |