2014-02-27 26 views
0

我有以下XML文档:将XML文档中的单个行转换为散列?

<AccountPerformanceReportColumns> 
    <Column name="AccountName" /> 
    <Column name="Impressions" /> 
    <Column name="Clicks" /> 
    <Column name="Ctr" /> 
    <Column name="Conversions" /> 
    <Column name="CostPerConversion" /> 
    <Column name="Spend" /> 
</AccountPerformanceReportColumns> 
<Table> 
<Row> 
    <AccountName value="Cleveland" /> 
    <Impressions value="5822" /> 
    <Clicks value="138" /> 
    <Ctr value="2.37" /> 
    <Conversions value="0" /> 
    <CostPerConversion value="" /> 
    <Spend value="238.28" /> 
</Row> 
<Row> 
    <AccountName value="Denver" /> 
    <Impressions value="8196" /> 
    <Clicks value="123" /> 
    <Ctr value="1.50" /> 
    <Conversions value="0" /> 
    <CostPerConversion value="" /> 
    <Spend value="258.32" /> 
</Row> 
<Row> 
    <AccountName value="Houston" /> 
    <Impressions value="7218" /> 
    <Clicks value="105" /> 
    <Ctr value="1.45" /> 
    <Conversions value="3" /> 
    <CostPerConversion value="75.88" /> 
    <Spend value="227.63" /> 
</Row> 
<Row> 
    <AccountName value="LA" /> 
    <Impressions value="72290" /> 
    <Clicks value="713" /> 
    <Ctr value="0.99" /> 
    <Conversions value="0" /> 
    <CostPerConversion value="" /> 
    <Spend value="932.93" /> 
</Row> 
<Row> 
    <AccountName value="Louisville" /> 
    <Impressions value="2811" /> 
    <Clicks value="68" /> 
    <Ctr value="2.42" /> 
    <Conversions value="0" /> 
    <CostPerConversion value="" /> 
    <Spend value="167.09" /> 
</Row> 
</Table> 

我试图用引入nokogiri解析它,并将其转换为一个哈希这样我可以像哈希创建数据库记录:

BingRecords.create!(conversions: hash[:conversion], 
        spend: hash[:spend], 
        account_name: hash[:account_name], 
        date: date, 
        user_id: user.id) 

如果是这样的:

hash[:account_name] => ["Cleveland", "Denver", "Houston", "LA", "Louisville"] 

我试图做这样的事情:

bingstats = doc.xpath("//AccountName", "//Spend", "//Conversions") 

这给了我从这些标签,然后stats = bingstats.map {|map| map.values}所有的数据返回:

[["Cleveland], ["Denver"], ["Houston"], ["LA"], ["Louisville"], ["238.28"], ["258.32"] 

但是这并没有给我把这些分开的单独记录的能力。

+0

你可以用'//行[N]/AccountName'访问一个'AccountName'特定行'n'。 '// Row [1]/AccountName/@ value'将返回字符串“Cleveland”。您还可以只检索行节点('Row')到一个对象中并使用ruby提取它们的子节点。 – helderdarocha

+0

您使用'create!()'的方式只能得到一条记录。我不确定这是不是你想要的。你想每行有一个记录吗? –

+0

@MarkThomas - 是的,只有一个记录。最终,这些片段是api请求的一部分,该请求只抓取一天的数据,并创建一条记录供稍后调用。 – macoughl

回答

0
doc = Nokogiri::XML(file).remove_namespaces! 
row = doc.xpath("//Row") 
account_name_tag = row.xpath("//AccountName") 
account_name_values = account_name_tag.map {|map| map.values} 
account_name_array = account_name_values.flatten 
hash = {account_name: account_name_array} 

那我就重复了支出,转换等,并将它们添加到哈希:

hash = {account_name: account_name_array, spend: spend_array, conversions: conversions_array} 
+0

这是一个答案?如果是这样,不要问是否有更有效的方法。如果它是你的问题的延续,那么应该通过编辑将它附加到问题上,并且应该删除这个答案。 –