Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 用XML数据填充表(使用Nokigiri/xpath)_Ruby_Xml_Xpath_Nokogiri - Fatal编程技术网

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

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

我正在利用Bing API收集广告活动的统计数据。我有一个XML文档,其中包含我需要的所有值,如下所示:

xml\u源

<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>