From b23eac6958ee2792d6fe60a31e8c636363e184d9 Mon Sep 17 00:00:00 2001 From: kou Date: Tue, 6 Dec 2016 13:57:56 +0000 Subject: [PATCH] rexml: REXML::Element#[] accepts String or Symbol as attribute name git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@57003 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- NEWS | 6 ++++++ lib/rexml/element.rb | 24 ++++++++++++++++++++++++ test/rexml/test_element.rb | 18 ++++++++++++++++++ 3 files changed, 48 insertions(+) create mode 100644 test/rexml/test_element.rb 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("") + # doc.root["attr"] # => "1" + # doc.root.attributes["attr"] # => "1" + # doc.root[1] # => + 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("") + assert_equal("Ruby", doc.root["name"]) + end + + def test_array_reference_symbol + doc = REXML::Document.new("") + assert_equal("Ruby", doc.root[:name]) + end + end +end