Ruby 如何阻止REXML转义字符?

Ruby 如何阻止REXML转义字符?,ruby,rexml,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") bas

我从一个数据库中提取一组数据,并通过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}")
然后将时间线\元添加到基本\对象\集合

base_object_collection << timeline_meta
我正试着去

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

有人能帮我看看我遗漏了什么,或者有更好的方法吗

为什么您担心单个引号/撇号会转换为实体?XML解析器/引擎这样做是为了帮助保留可能是不明确/冲突的定界字符。从XML规范中,关于:

因为我们可以使用
来限定
注释
参数的内容,所以规范允许将嵌入的单引号和双引号编码为实体,从而避免冲突

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

作为代码中的一种风格:

timeline_meta.add_attribute("#{k}","#{v}")
错误。您正在冗余地将字符串转换为字符串。请使用:

timeline_meta.add_attribute(k, v)

相反。

为什么要担心单引号/撇号转换为实体?XML解析器/引擎这样做是为了帮助保留可能是歧义/冲突的定界字符。XML规范中关于:

因为我们可以使用
来限定
注释
参数的内容,所以规范允许将嵌入的单引号和双引号编码为实体,从而避免冲突

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

作为代码中的一种风格:

timeline_meta.add_attribute("#{k}","#{v}")
这是错误的。您正在冗余地将字符串转换为字符串。使用:

timeline_meta.add_attribute(k, v)

相反。

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

问题是REXML的实现非常依赖于Ruby版本,事实上,例如Ruby 1.8.6的不同补丁之间的实现差别很大

应该阻止REXML转义实体的上下文标志是
:raw
,但它在您的案例中不起作用的事实可能意味着REXML不理解该标志或您将其设置为的值

如果您使用的是早于1.8.6-p110的Ruby版本,那么您就不走运了。此版本不支持上下文标志,如
:attribute\u quote
:raw
。所以你唯一的选择就是

  • 升级至Ruby的更高版本1.8.6-p110及更高版本

  • 或者对替换转义实体的原始XML进行后期处理。这应该 REXML将
    转换为&;后的工作
    &;至&;amp


  • 如果您使用的是更高版本的Ruby,则必须将
    上下文[:raw]
    设置为
    :all
    或在raw模式下处理的名称列表。上下文也可以像so
    Document.new(nil,{:raw=>:all,:attribute{u quote=>:quote})一样传递到
    Document
    构造函数中。
    我知道这个问题很老了,但我刚刚遇到了同样的问题,我的发现可能会帮助那些仍然被迫使用Ruby 1.8.6的人

    问题是REXML的实现非常依赖于Ruby版本,事实上,例如Ruby 1.8.6的不同补丁之间的实现差别很大

    应该阻止REXML转义实体的上下文标志是
    :raw
    ,但它在您的案例中不起作用的事实可能意味着REXML不理解该标志或您将其设置为的值

    如果您使用的是早于1.8.6-p110的Ruby版本,那么您就不走运了。此版本不支持上下文标志,如
    :attribute\u quote
    :raw
    。所以你唯一的选择就是

  • 升级至Ruby的更高版本1.8.6-p110及更高版本

  • 或者对替换转义实体的原始XML进行后期处理。这应该 REXML将
    转换为&;后的工作
    &;至&;amp


  • 如果您使用的是更高版本的Ruby,则必须将
    上下文[:raw]
    设置为
    :all
    或在raw模式下处理的名称列表。上下文也可以像so
    Document.new(nil,{:raw=>:all,:attribute\u quote=>:quote})一样传递到
    Document
    构造函数中。我不太确定最后一个
    注释=“xxxxx”
    的意思。但是REXML中的文本节点是
    REXML::text
    的一个实例,它有一个带有6个参数的
    new
    方法,
    new(arg,尊重空格=false,父节点=nil,原始节点=nil,实体过滤器=nil,非法节点=需要再次检查)
    raw
    可能是您想要的东西。所以我尝试了这个,timeline\u meta=Element.new(“Metadata”,raw=“true”),但是我得到了一个错误。timeline_json_meta.each do|k,v |除非v==nil除非v==“如果k==”注释(freeformtextbox)“k=”注释“如果k==”id“k=”k=“CatDV_id”如果k.include?(“/”)k=k.gsub(“/”,”u”)结束时间线。添加属性(k,v)结束结束我不太确定最后一个
    Comments=“xxxxx”
    的意思。但是REXML中的文本节点是
    REXML::text
    的一个实例,它有一个带有6个参数的
    new
    方法,
    new(arg,尊重空格=false,父节点=nil,原始节点=nil,实体过滤器=nil,非法节点=需要再次检查)
    raw