2012-12-06 28 views
1

我从一个数据库中提取一堆数据,并通过XML将其提供给应用程序。如何阻止REXML转义字符?

于是我开始

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&apos;re pretty good... 

我试图让

...Comments="GRUBB: We're pretty good... 

谁能帮我看看我缺少什么,或者更好的方式来做到这一点?

+0

我不太确定最后一个'Comments =“xxxxx”'的含义。但是REXML中的文本节点是'REXML :: Text'的一个实例,它有一个带有6个参数的'new'方法,'new(arg,respect_whitespace = false,parent = nil,raw = nil,entity_filter = nil,illegal = NEEDS_A_SECOND_CHECK)'。 '生'可能是你想要的东西。 – halfelf

+0

所以我试试这个,timeline_meta = Element.new(“Metadata”,raw =“true”),但是我得到一个错误。 timeline_json_meta.each do | k,v | 除非v ==零 除非v == “” 如果k == “评论(freeformtextbox)” K = “注释” 端 如果k == “ID” K = “CatDV_ID” 端 如果k.include?( “/”) K = k.gsub( “/”, “_”) 端 timeline_meta.add_attribute(K,v) 端 端 端 – user1881095

回答

1

为什么你担心单引号/撇号被转换为实体? XML解析器/引擎可以帮助保留可能是模棱两可的/冲突的分隔字符。从XML规范有关Character Data and Markup

To allow attribute values to contain both single and double quotes, the 
apostrophe or single-quote character (') may be represented as " &apos; ", and 
the double-quote character (") as " &quot; ". 

因为我们可以界定为使用任何'"Comments参数的内容,该规范允许编码嵌入的单引号和双引号的实体,避免碰撞。

当XML在接收端被解析时,它应该将该实体解码回正确的字符,或者有一些简单的函数/方法。你没有指定你正在使用的DBM,但它应该能够提供帮助,但这是一个单独的问题。

在你的代码风格的东西:

timeline_meta.add_attribute("#{k}","#{v}") 

是错误的。你冗余地将字符串转换为字符串。使用:

timeline_meta.add_attribute(k, v) 

改为。

+0

不幸的是,在接收侧,我没有选择,因为这是与另一个软件无法处理接收与替换文本的集成。我需要能够发送值而不需要转换特殊字符。任何想法如何做到这一点? 感谢您对额外刺激转换的指示,我有一种感觉,我可能在那里是多余的。 ;) – user1881095

0

我知道这个问题很老,但我刚刚遇到同样的问题,我的发现可能会帮助那些仍然被迫使用Ruby 1.8.6的人。

事情是REXML的实现非常依赖于Ruby版本,实际上在Ruby 1.8.6的不同补丁之间实现差异很大。

应该从转义实体停止REXML的上下文标志是:raw,但事实上它不适用于您的情况可能意味着REXML不理解标志或您设置的值。

如果您使用的是早于1.8.6-p110的Ruby版本,那么您运气不好。此版本不支持上下文标志,如:attribute_quote:raw。所以你唯一的选择是要么

  1. 升级到红宝石,1.8.6-P110及以上的更高版本。

  2. 或后处理原始XML替换转义实体。这因为REXML应该 工作将转换& to &amp;&amp; to &amp;amp;

如果你使用Ruby的更高版本,然后context[:raw]必须被设置为:all或名称的列表,以原始模式处理。上下文也可以传递到Document的构造函数中,就像这样Document.new(nil, {:raw => :all, :attribute_quote => :quote})