Ruby 如何阻止REXML转义字符?
我从一个数据库中提取一组数据,并通过XML将其输入到应用程序中 所以我从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
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
。所以你唯一的选择就是
转换为&;后的工作代码>和&;至&;amp代码>
如果您使用的是更高版本的Ruby,则必须将
上下文[:raw]
设置为:all
或在raw模式下处理的名称列表。上下文也可以像soDocument.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
。所以你唯一的选择就是
转换为&;后的工作代码>和&;至&;amp代码>
如果您使用的是更高版本的Ruby,则必须将
上下文[:raw]
设置为:all
或在raw模式下处理的名称列表。上下文也可以像soDocument.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