Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在ruby哈希中重命名密钥名称时,如何保持密钥的位置?_Ruby_Xml_Hash - Fatal编程技术网

在ruby哈希中重命名密钥名称时,如何保持密钥的位置?

在ruby哈希中重命名密钥名称时,如何保持密钥的位置?,ruby,xml,hash,Ruby,Xml,Hash,我想把json转换成xml。 首先,我将json转换为哈希,因为我想更改一些键的名称。我使用映射进行更改 @issue_xml = "tmp.xml" issues = File.new(@issue_xml, File::WRONLY|File::TRUNC|File::CREAT) issues.puts "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" issues.puts "<errorList xmlns=\"http:

我想把json转换成xml。 首先,我将json转换为哈希,因为我想更改一些键的名称。我使用映射进行更改

@issue_xml = "tmp.xml"

issues = File.new(@issue_xml, File::WRONLY|File::TRUNC|File::CREAT)

issues.puts "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"

issues.puts "<errorList xmlns=\"http://www.klocwork.com/inForce/report/1.0\" version=\"9.5.2\">"
mappings = {"id" => "problemID","severityCode" => "severitylevel","status" => "citingStatus"}

my_hash = JSON.parse(line)    
my_hash.keys.each { |k| my_hash[ mappings[k] ] = my_hash.delete(k) if mappings[k] }


my_xml = my_hash.to_xml(:root => 'problem')

my_xml.each_line do |line|        
    next if line.start_with?("<?xml") or line.eql?("<hash>") or line.eql?("</hash>")
    issues.puts line        
end 
issues.puts "</errorList>"

issues.close  
@issue\u xml=“tmp.xml”
issues=File.new(@issue_xml,File::WRONLY | File::TRUNC | File::CREAT)
发行。卖出“”
发行。卖出“”
映射={“id”=>“problemID”、“severityCode”=>“severitylevel”、“status”=>“citingStatus”}
my_hash=JSON.parse(第行)
my|hash.keys.each{k|my|hash[mappings[k]]=my|hash.delete(k)if mappings[k]}
my_xml=my_hash.to_xml(:root=>problem)
my_xml.each_line do|line|

下一个if line.start_with?(“这段代码似乎是按照未映射JSON的顺序,而不是按照“mappings”散列的顺序

你可以试试这样的吗

mappings = {"id" => "problemID","severityCode" => "severitylevel","status" => "citingStatus"}

hash = JSON.parse(line)    
my_hash = {}
mappings.keys.each { |k| my_hash[ mappings[k] ] = hash.delete(k) if hash[k] }
my_hash.merge! hash

我不确定我是否理解这个问题。请让我知道以下内容是否满足您的要求。如果不满足,请根据需要更改我的示例,并为
my\u hash
提供所需的结果

代码

my_hash = JSON.parse(line)
mappings.each { |k,_| my_hash[mappings[k] = my_hash.delete(k) }
mappings = { "id"=>"problemID", "severityCode"=>"severitylevel",
             "status"=>"citingStatus" }
my_hash = { "cat"=>0, "id"=>1, "status"=>2, "severityCode"=>3,
            "problemID"=>4, "dog"=>5, "citingStatus"=>6, "severitylevel"=>7 }
mappings.each { |k,_| my_hash[mappings[k]] = my_hash.delete(k) }
my_hash
  #=> { "cat"=>0, "problemID"=>1, "dog"=>5,
  #     "citingStatus"=>2, "severitylevel"=>3 }
示例

my_hash = JSON.parse(line)
mappings.each { |k,_| my_hash[mappings[k] = my_hash.delete(k) }
mappings = { "id"=>"problemID", "severityCode"=>"severitylevel",
             "status"=>"citingStatus" }
my_hash = { "cat"=>0, "id"=>1, "status"=>2, "severityCode"=>3,
            "problemID"=>4, "dog"=>5, "citingStatus"=>6, "severitylevel"=>7 }
mappings.each { |k,_| my_hash[mappings[k]] = my_hash.delete(k) }
my_hash
  #=> { "cat"=>0, "problemID"=>1, "dog"=>5,
  #     "citingStatus"=>2, "severitylevel"=>3 }
这:

相当于:

issues = File.new(@issue_xml, 'w')
issues.puts %Q{<?xml version="1.0" encoding="UTF-8" ?>}
…因此,除非您喜欢键入所有这些常量或将它们合并在一起,否则请使用较短的版本

接下来,在您的有生之年,您很可能永远不需要在ruby中转述一句话。这是:

issues.puts "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"
哈希没有to_xml()方法:

my_xml = my_hash.to_xml(:root => 'problem')
我不知道你为什么发布了所有未运行的代码…因为你的问题与该代码无关。请尝试以下操作:

data = {
  'a' => 1,
  'b' => 2,
  'c' => 3,
}

key_map = {
  'b' => 'y',
  'a' => 'x',
}

results = {}

data.keys.each do |key|
  new_key = key_map[key] || key
  results[new_key] = data[key]
end

p results

--output:--
{"x"=>1, "y"=>2, "c"=>3}

我试过了。结果显示,所有映射键都被移动到xml的开头@A Fader darkli使用您的建议解决了它。我安装了active_支持以使用“to_xml”。因此,我的脚本正在运行。非常感谢@7stud
data = {
  'a' => 1,
  'b' => 2,
  'c' => 3,
}

key_map = {
  'b' => 'y',
  'a' => 'x',
}

results = {}

data.keys.each do |key|
  new_key = key_map[key] || key
  results[new_key] = data[key]
end

p results

--output:--
{"x"=>1, "y"=>2, "c"=>3}