Ruby 用XML数据填充表(使用Nokigiri/xpath)
我正在利用Bing API收集广告活动的统计数据。我有一个XML文档,其中包含我需要的所有值,如下所示: xml\u源Ruby 用XML数据填充表(使用Nokigiri/xpath),ruby,xml,xpath,nokogiri,Ruby,Xml,Xpath,Nokogiri,我正在利用Bing API收集广告活动的统计数据。我有一个XML文档,其中包含我需要的所有值,如下所示: xml\u源 <Table> <Row> <CampaignName value="Air Duct Cleaning" /> <Status value="Active" /> <Impressions value="1302" /> <Clicks value="39" /> </Row&g
<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>
获取其中每个的值-
stats = bingstats.map {|map| map.values}
# => [["Air Duct Cleaning"], ["Carpet Cleaning"], ["Brand Terms"], ["active"], ["active"], ["active"], ["1302"], ["6946"], ["5012"], ["39"], ["130"], ["196"]
我是否正确使用了xpath?我是否需要引用//表/行元素?如何设置它,以便表中的项目可以配对
非常感谢您的帮助 更好的方法是首先查询XML中所有
行
元素,给出一个可以迭代的节点集:
bingstats = doc2.xpath("//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
),以便该变量在视图中可用。Matt-感谢您的回复!这让我非常接近。我在视图中实现了您的建议,每个建议的输出都是一个Nokogiri::XML::Element
。我调用了.values
像行一样。at_xpath(“活动名”).values
和每个值的输出结果都是一个元素数组,如[“风道清洁”]
-我应该如何将其拉出?您可以执行行。at_xpath(“活动名”).values。首先
,但最好是这样做:row.at_xpath(“活动名称/@value”)
@macoull我已经用更好的xpath查询更新了答案,这些查询提取了您想要的值。他们现在应该给你想要的。太好了!谢谢你们两位。你能给我一个快速的解释,或者告诉我应该研究什么来理解(“活动名称/@value”)
中的语法/@value
?我永远也不会知道我能够在那里添加它,以基本上替换我在第一条评论中使用的.values
调用。
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>