Вот прелесть использования парсера, такого как Nokogiri :
Это позволяет вам манипулировать выбранными тегами (узлами) и их атрибутами:
require 'nokogiri'
xml = <<EOT
<xml>
<Image ImagePath="path/to/image">image comment</Image>
<Text TextFont="courier" TextSize="9">this is the text</Text>
</xml>
EOT
doc = Nokogiri::XML(xml)
doc.search('Image').each do |n|
n.name = 'img'
n.attributes['ImagePath'].name = 'path'
end
doc.search('Text').each do |n|
n.name = 'txt'
n.attributes['TextFont'].name = 'font'
n.attributes['TextSize'].name = 'size'
end
print doc.to_xml
# >> <?xml version="1.0"?>
# >> <xml>
# >> <img path="path/to/image">image comment</img>
# >> <txt font="courier" size="9">this is the text</txt>
# >> </xml>
Если вынужно перебрать каждый узел, может быть, чтобы сделать универсальное преобразование имени тега, вы можете использовать doc.search('*').each
.Это будет медленнее, чем поиск отдельных тегов, но может привести к меньшему количеству кода, если вам потребуется изменить каждый тег.
Хорошая особенность использования парсера в том, что он будет работать, даже если макет XML изменяетсяпоскольку он не заботится о пробелах и будет работать даже при изменении порядка атрибутов, делая ваш код более надежным.