我从一个数据库中提取大量数据,然后通过XML将其提供给应用程序。
所以我从
开始 re_objects_xml = Document.new
re_objects_xml.context[:attribute_quote] = :quote
re_objects_xml.context[:raw] = 'true'
re_objects_xml.add_element("object-collection")
base_object_collection = re_objects_xml.elements[1]
timeline_meta = Element.new("Metadata")
timeline_meta.add_attribute("id", "#{re_meta_id}")
然后我有以下变量:
k = "Comments"
v = "We're pretty good"
我做了
timeline_meta.add_attribute("#{k}","#{v}")
然后将timeline_meta添加到base_object_collection
base_object_collection << timeline_meta
我最终得到的XML包含:
...Comments="GRUBB: We're pretty good...
我想要
...Comments="GRUBB: We're pretty good...
任何人都可以帮我看看我缺少的东西或更好的方法吗?
答案 0 :(得分:1)
为什么你担心单引号/撇号被转换为实体? XML解析器/引擎可以帮助保留可能是模糊/冲突的分隔符。来自关于Character Data and Markup的XML规范:
To allow attribute values to contain both single and double quotes, the
apostrophe or single-quote character (') may be represented as " ' ", and
the double-quote character (") as " " ".
因为我们可以使用Comments
或'
来界定"
参数的内容,所以规范允许将嵌入的单引号和双引号编码为实体,从而避免冲突。
当在接收端解析XML时,它应该将该实体解码回正确的字符,或者具有一些使其变得容易的功能/方法。您没有指定您正在使用的DBM但它应该能够提供帮助,但这是一个单独的问题。
作为代码中的风格内容:
timeline_meta.add_attribute("#{k}","#{v}")
错了。您将冗余的字符串转换为字符串。使用:
timeline_meta.add_attribute(k, v)
代替。
答案 1 :(得分:0)
我知道这个问题已经很老了,但我遇到了同样的问题,我的发现可能会帮助那些仍然被迫使用Ruby 1.8.6的人。
问题是REXML的实现非常依赖于Ruby版本,事实上,不同的Ruby 1.8.6补丁之间的实现差别很大。
应该从转义实体中停止REXML的上下文标志是:raw
但是它在你的情况下不起作用的事实可能意味着REXML不理解你设置它的标志或值。
如果你使用的是早于1.8.6-p110的Ruby版本,那么你就不走运了。此版本不支持:attribute_quote
或:raw
等上下文标记。所以你唯一的选择是
升级到更高版本的Ruby,1.8.6-p110及更高版本。
- 醇>
或者对原始XML替换转义实体进行后处理。这应该 因为REXML将转换
& to &
和& to &amp;
如果您使用的是更高版本的Ruby,则必须将context[:raw]
设置为:all
或以原始模式处理的名称列表。上下文也可以像Document
Document.new(nil, {:raw => :all, :attribute_quote => :quote})
构造函数中