REXMLを使用してXMLを作成するとき、Elementに子ノードを追加する場合にadd_elementを使用し、同時に属性値も追加していた。しかし何故か&がエスケープされなかった。’はエスケープされるけど。以下コードで調べてみたら、add_elementで属性追加するとエスケープされないけど、add_attributeで追加するとエスケープされることが分かった。
require 'rexml/document'
value = "<>&\'\""
sample = REXML::Element.new("a")
sample.add_element("b", {"attr" => value})
c_tag = sample.add_element("c")
c_tag.add_attribute("attr",value)
xml = ""
formatter = REXML::Formatters::Pretty.new
formatter.compact = true
formatter.write(sample, xml)
puts xml
実行結果
<a> <b attr='<>&'"'/> <c attr='<>&'"'/> </a>
なぜ?
動作環境 Ruby 1.8.7