diff options
Diffstat (limited to 'lib/rexml/element.rb')
-rw-r--r-- | lib/rexml/element.rb | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/lib/rexml/element.rb b/lib/rexml/element.rb index ffc81bed91..25e530de41 100644 --- a/lib/rexml/element.rb +++ b/lib/rexml/element.rb @@ -73,10 +73,10 @@ module REXML @attributes.each_attribute do |attr| rv << " " attr.write( rv, 0 ) - end unless @attributes.empty? + end if children.size > 0 - rv << " ... </>" + rv << "> ... </>" else rv << "/>" end @@ -517,6 +517,17 @@ module REXML :element end + def xpath + path_elements = [] + cur = self + path_elements << __to_xpath_helper( self ) + while cur.parent + cur = cur.parent + path_elements << __to_xpath_helper( cur ) + end + return path_elements.reverse.join( "/" ) + end + ################################################# # Attributes # ################################################# @@ -677,6 +688,20 @@ module REXML private + def __to_xpath_helper node + rv = node.expanded_name + if node.parent + results = node.parent.find_all {|n| + n.kind_of?(REXML::Element) and n.expanded_name == node.expanded_name + } + if results.length > 1 + idx = results.index( node ) + rv << "[#{idx+1}]" + end + end + rv + end + # A private helper method def each_with_something( test, max=0, name=nil ) num = 0 @@ -950,6 +975,10 @@ module REXML return nil end + def to_a + values.flatten + end + # Returns the number of attributes the owning Element contains. # doc = Document "<a x='1' y='2' foo:x='3'/>" # doc.root.attributes.length #-> 3 |