如何阻止REXML转义字符?

时间:2012-12-06 03:18:12

标签: ruby rexml

我从一个数据库中提取大量数据,然后通过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&apos;re pretty good... 

我想要

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

任何人都可以帮我看看我缺少的东西或更好的方法吗?

2 个答案:

答案 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 " &apos; ", and
the double-quote character (") as " &quot; ".

因为我们可以使用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等上下文标记。所以你唯一的选择是

  
      
  1. 升级到更高版本的Ruby,1.8.6-p110及更高版本。

  2.   
  3. 或者对原始XML替换转义实体进行后处理。这应该   因为REXML将转换& to &amp;&amp; to &amp;amp;

  4.   

如果您使用的是更高版本的Ruby,则必须将context[:raw]设置为:all或以原始模式处理的名称列表。上下文也可以像Document

一样传递到Document.new(nil, {:raw => :all, :attribute_quote => :quote})构造函数中