我想将json转换为xml。 起初,我将json转换为hash,因为我想更改某些键的名称。我使用映射进行更改。
@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
使用上面的代码,我可以生成一个xml文件。 但结果与我的期望略有不同。
这是我的问题。
我希望关键'problemID'出现在每个问题的开头。但新映射的密钥'problemID,severityCode,citingStatus'被移动到最后。
你能让我知道如何保持钥匙的位置吗?
非常感谢。
答案 0 :(得分:2)
此:
issues = File.new(@issue_xml, File::WRONLY|File::TRUNC|File::CREAT)
相当于:
issues = File.new(@issue_xml, 'w')
...所以,除非你喜欢将所有这些常数输入OR',否则请使用较短的版本。
接下来,很可能在你的一生中,你永远不需要在ruby中逃避引用。这样:
issues.puts "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"
相当于:
issues.puts %Q{<?xml version="1.0" encoding="UTF-8" ?>}
在这种情况下,你可以写:
issues.puts '<?xml version="1.0" encoding="UTF-8" ?>'
行变量在哪里:
my_hash = JSON.parse(line)
哈希没有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}
答案 1 :(得分:0)
这段代码似乎是按照未映射的JSON的顺序放置的,而不是&#39;映射的顺序。散列。
你可以试试这样的东西吗?
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
答案 2 :(得分:0)
我不确定我是否理解这个问题。如果以下内容满足您的要求,请告知我们。如果没有,请根据需要更改我的示例,并为my_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 }