2014-01-17 47 views
1

我利用Bing API從廣告系列收集統計信息。我有一個XML文檔與我所需要的,看起來像這樣的價值觀:使用XML數據填充表(使用Nokigiri/xpath)

xml_source

<Table> 
<Row> 
    <CampaignName value="Air Duct Cleaning" /> 
    <Status value="Active" /> 
    <Impressions value="1302" /> 
    <Clicks value="39" /> 
</Row> 
<Row> 
    <CampaignName value="Carpet Cleaning" /> 
    <Status value="Active" /> 
    <Impressions value="6946" /> 
    <Clicks value="130" /> 
</Row> 
<Row> 
    <CampaignName value="Brand Terms" /> 
    <Status value="Active" /> 
    <Impressions value="5012" /> 
    <Clicks value="196" /> 
</Row> 
</Table> 

我想安裝在我看來,一個表,最終看起來像:

查看

<table> 
<tr> 
    <td>Air Duct Cleaning</td> 
    <td>Active</td> 
    <td>1302</td> 
    <td>39</td> 
    ... 

我把它設置爲引入nokogiri :: XML ::文檔

doc = Nokogiri::XML(xml_source) 
doc2 = doc.remove_namespaces! 

bingstats = doc2.xpath("//CampaignName", "//Status", "//Impressions", "//Clicks") #creates a Nokogiri::XML::Nodeset 

要獲取值爲每個那些 -

stats = bingstats.map {|map| map.values} 
# => [["Air Duct Cleaning"], ["Carpet Cleaning"], ["Brand Terms"], ["active"], ["active"], ["active"], ["1302"], ["6946"], ["5012"], ["39"], ["130"], ["196"] 

我使用了XPath正確?我需要引用// Table/Row元素嗎?我如何設置它以便物品可以在表中配對在一起?

任何幫助,非常感謝!

回答

1

一個更好的辦法是首先查詢所有元素的XML,給人一種節點設置,你可以遍歷:

bingstats = doc2.xpath("//Row") 

您現在可以遍歷Rows並獲取與每一個相關的數據另一個XPath查詢從節點開始,所以對於每個廣告系列中的數據放在一起,例如:

bingstats.each do |row| 
    name = row.at_xpath("CampaignName/@value") 
    status = row.at_xpath("Status/@value") 
    impressions = row.at_xpath("Impressions/@value") 
    clicks = row.at_xpath("Clicks/@value") 

    #... 
end 

你甚至可以做到這一點在你的觀點 - 如果你正在使用厄爾布這將看小號例如:

<table> 
    <% bingstats.each do |row| %> 
    <tr> 
     <td><%= row.at_xpath("CampaignName/@value") %></td> 
     <td><%= row.at_xpath("Status/@value") %></td> 
     <td><%= row.at_xpath("Impressions/@value") %></td> 
     <td><%= row.at_xpath("Clicks/@value") %></td> 
    </tr> 
    <% end %> 
</table> 

您可能需要使bingstats爲實例變量(即, @bingstats)如果你這樣做,所以變量在視圖中可用。

+0

馬特 - 謝謝你的迴應!這讓我非常接近。我在視圖中實現了你的建議,每個​​的輸出都是'Nokogiri :: XML :: Element'。我將'.values'稱爲'row.at_xpath(「CampaignName」).values',每個​​的輸出結果都是像'[「Air Duct Cleaning」]這樣的單個元素數組的結果' - 我應該如何它離開那裏? – macoughl

+1

您可以執行'row.at_xpath(「CampaignName」)。values.first',但最好做些像:'row.at_xpath(「CampaignName/@ value」)''。 –

+0

@macoughl我已經用更好的XPath查詢更新了答案,這些查詢提取了您想要的「值」。他們現在應該給你之後的東西。 – matt