【问题标题】:Convert individual rows in an XML doc to a hash?将 XML 文档中的单个行转换为哈希?
【发布时间】:2014-03-05 09:47:42
【问题描述】:

我有以下 XML 文档:

<AccountPerformanceReportColumns>
  <Column name="AccountName" />
  <Column name="Impressions" />
  <Column name="Clicks" />
  <Column name="Ctr" />
  <Column name="Conversions" />
  <Column name="CostPerConversion" />
  <Column name="Spend" />
</AccountPerformanceReportColumns>
<Table>
<Row>
  <AccountName value="Cleveland" />
  <Impressions value="5822" />
  <Clicks value="138" />
  <Ctr value="2.37" />
  <Conversions value="0" />
  <CostPerConversion value="" />
  <Spend value="238.28" />
</Row>
<Row>
  <AccountName value="Denver" />
  <Impressions value="8196" />
  <Clicks value="123" />
  <Ctr value="1.50" />
  <Conversions value="0" />
  <CostPerConversion value="" />
  <Spend value="258.32" />
</Row>
<Row>
  <AccountName value="Houston" />
  <Impressions value="7218" />
  <Clicks value="105" />
  <Ctr value="1.45" />
  <Conversions value="3" />
  <CostPerConversion value="75.88" />
  <Spend value="227.63" />
</Row>
<Row>
  <AccountName value="LA" />
  <Impressions value="72290" />
  <Clicks value="713" />
  <Ctr value="0.99" />
  <Conversions value="0" />
  <CostPerConversion value="" />
  <Spend value="932.93" />
</Row>
<Row>
  <AccountName value="Louisville" />
  <Impressions value="2811" />
  <Clicks value="68" />
  <Ctr value="2.42" />
  <Conversions value="0" />
  <CostPerConversion value="" />
  <Spend value="167.09" />
</Row>
</Table>

我正在尝试使用 Nokogiri 解析它并将其转换为哈希,以便我可以为哈希创建数据库记录,例如:

BingRecords.create!(conversions: hash[:conversion],
                   spend: hash[:spend],
                   account_name: hash[:account_name],
                   date: date,
                   user_id: user.id)

类似的地方:

hash[:account_name] => ["Cleveland", "Denver", "Houston", "LA", "Louisville"]

我尝试做类似的事情:

bingstats = doc.xpath("//AccountName", "//Spend", "//Conversions")

这给了我来自这些标签的所有数据,然后是stats = bingstats.map {|map| map.values},它返回:

[["Cleveland], ["Denver"], ["Houston"], ["LA"], ["Louisville"], ["238.28"], ["258.32"]

但这并没有让我能够将它们分开以用于单独的记录。

【问题讨论】:

  • 您可以使用//Row[n]/AccountName 访问AccountName 以获取特定行n//Row[1]/AccountName/@value 将返回字符串“Cleveland”。您还可以仅将行节点 (//Row) 检索到对象中并在 ruby​​ 中提取它们的子节点。
  • 您使用create!() 的方式只会得到一条记录。我不确定这是否是你想要的。您想要每行一条记录吗?
  • @MarkThomas - 是的,只有一条记录。最终,这些 sn-ps 是 api 请求的一部分,该请求仅获取一天的数据并创建记录以供以后调用。
  • @helderdarocha - //Row[1]/AccountName/@value 返回一个 Nokogiri 属性,我可以将其解析为“Cleveland”字符串。这仍然没有让我得到一个哈希值,我可以调用 hash[:account_name] 来获取所有帐户名称。

标签: ruby-on-rails xml xpath nokogiri


【解决方案1】:

我对这个问题的回答如何:https://stackoverflow.com/a/10144623/405017

有了它,您可以在任何单个 Nokogiri 元素上调用 to_hash 并取回一个不错的哈希值。

然后,您可以(如果需要)仅选择所需的哈希字段:Slicing params hash for specific values

【讨论】:

    【解决方案2】:
    doc = Nokogiri::XML(file).remove_namespaces!
    row = doc.xpath("//Row")
    account_name_tag = row.xpath("//AccountName")
    account_name_values = account_name_tag.map {|map| map.values}
    account_name_array = account_name_values.flatten
    hash = {account_name: account_name_array}
    

    然后我将重复支出、转换等并将它们添加到哈希中:

    hash = {account_name: account_name_array, spend: spend_array, conversions: conversions_array}
    

    【讨论】:

    • 这是一个答案吗?如果是这样,不要问是否有更有效的方法。如果它是您问题的延续,则应通过编辑将其附加到问题中,并且应删除此答案。
    猜你喜欢
    • 2010-11-16
    • 2017-07-06
    • 2021-07-13
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 2011-05-08
    相关资源
    最近更新 更多