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