1

我正在从一个数据库中提取一堆数据并通过 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...

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

4

2 回答 2

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)

反而。

于 2012-12-06T15:46:50.040 回答
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. 或者对原始 XML 进行后处理以替换转义实体。这应该可以工作,因为 REXML 将转换& to &amp;&amp; to &amp;amp;

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

于 2013-06-10T17:55:29.630 回答