0
我有很多独特的XML事件,我已经转换成大约300个密钥的哈希。这些键中大多数的值都是哈希值,再次,其中一些键的值是哈希值。我不知道散列嵌套会走多深。红宝石嵌套散列 - 确定单独的事件
我想写一个无模式数据库的原始300的每个哈希值及其所有关键字&值(无论它有多少)。
我已经设法编写一个(messy)方法来输出每个Hash的值,而不管它的值可能包含多少个Hashes。
我现在面临的问题是我无法确定一个哈希开始的位置,而一个哈希结束。因此,我无法将单独的事件写入数据库,因为我只剩下所有Hashes的输出。
如何确定哪些是单独的事件?
这里是我的代码:
require 'crack'
require 'awesome_print'
def printingOutHash(inputHash)
#ap inputHash
if inputHash.kind_of?(Array)
puts "array"
inputHash.each do |x|
printingOutHash(x)
end
end
if inputHash.kind_of?(Hash)
inputHash.each do |k, v|
if v.kind_of?(Hash)
printingOutHash(v)
else
ap "#{k}: #{v}"
end
end
end
end
h = Crack::XML.parse("<Events><Event><System><Provider Name='Service Control Manager' Guid='{555908d1-a6d7-4695-8e1e-26931d2012f4}' EventSourceName='Service Control Manager'/><EventID Qualifiers='16384'>7036</EventID><Version>0</Version><Level>4</Level><Task>0</Task><Opcode>0</Opcode><Keywords>0x8080000000000000</Keywords><TimeCreated SystemTime='2013-03-25T05:00:38.021800000Z'/><EventRecordID>17629</EventRecordID><Correlation/><Execution ProcessID='476' ThreadID='3028'/><Channel>System</Channel><Computer>AMAZONA-ONIST5V</Computer><Security/></System><EventData><Data Name='param1'>Windows Modules Installer</Data><Data Name='param2'>stopped</Data><Binary>540072007500730074006500640049006E007300740061006C006C00650072002F0031000000</Binary></EventData></Event><Event><System><Provider Name='Service Control Manager' Guid='{555908d1-a6d7-4695-8e1e-26931d2012f4}' EventSourceName='Service Control Manager'/><EventID Qualifiers='16384'>7040</EventID><Version>0</Version><Level>4</Level><Task>0</Task><Opcode>0</Opcode><Keywords>0x8080000000000000</Keywords><TimeCreated SystemTime='2013-03-25T05:00:37.741000000Z'/><EventRecordID>17628</EventRecordID><Correlation/><Execution ProcessID='476' ThreadID='3028'/><Channel>System</Channel><Computer>AMAZONA-ONIST5V</Computer><Security UserID='S-1-5-18'/></System><EventData><Data Name='param1'>Windows Modules Installer</Data><Data Name='param2'>auto start</Data><Data Name='param3'>demand start</Data><Data Name='param4'>TrustedInstaller</Data></EventData></Event></Events>")
printingOutHash(h['Events']['Event'])
谢谢! Nokogiri似乎是我已经拥有的更简单的解决方案。我也想过剥离一些索引值(guid,event name,timestamp),把它们放到我的数据库中,然后将我的散列转换为一个字符串并将整个字符串存储在数据库中。这使我可以在数据库中搜索我需要的事件,并在嵌套散列的数据库中拥有完整的事件。当我检索它时,我只是将它转换回散列。 – Michael 2013-04-08 01:24:29
是的,提取字段并存储那些有价值的字段,但不要麻烦序列化哈希并存储它,因为它基本上是浪费空间。搜索并将返回的记录转换回散列或散列数组很简单。 – 2013-04-08 01:32:03