使用XML数据填充表(使用Nokogiri / xpath)

时间:2014-01-17 00:26:35

标签: ruby xml xpath nokogiri

我正在使用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?我需要引用//表/行元素吗?如何设置它以便项目可以在表格中组合在一起?

非常感谢任何帮助!

1 个答案:

答案 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),因此该变量在视图中可用。