2014-02-27 56 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

這是一個答案?如果是這樣,不要問是否有更有效的方法。如果它是你的問題的延續,那麼應該通過編輯將它附加到問題上,並且應該刪除這個答案。 –