summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS6
-rw-r--r--lib/rexml/element.rb24
-rw-r--r--test/rexml/test_element.rb18
3 files changed, 48 insertions, 0 deletions
diff --git a/NEWS b/NEWS
index 8456189a28..eee221e374 100644
--- a/NEWS
+++ b/NEWS
@@ -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