我正在使用Bing API从广告系列中收集统计信息。我有一个XML文档,其中包含我需要的所有值,如下所示:
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 :: Document
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?我需要引用//表/行元素吗?如何设置它以便项目可以在表格中组合在一起?
非常感谢任何帮助!
答案 0 :(得分:1)
更好的方法是首先查询所有Row
元素的XML,给出一个可以迭代的节点集:
bingstats = doc2.xpath("//Row")
您现在可以迭代Rows
并使用从Row
节点开始的另一个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
你甚至可以在你的视图中这样做 - 如果你使用的是Erb,这看起来像是:
<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
),因此该变量在视图中可用。