Вы можете использовать правильный HTML-парсер, чтобы сделать это.Я бы порекомендовал Nokogiri для работы:
require 'nokogiri'
# ...
s = "<a href='http://example.com'>incomplete"
Nokogiri::HTML::fragment(sanitize(s, :tags => ['a', 'p'])).to_xml
# => "<a href=\"http://example.com\">incomplete</a>"
Это всегда будет возвращать действительный XML.Конечно, вы можете упаковать это в свой собственный вспомогательный метод для более легкого использования.