【问题标题】:Get all attributes for elements in XML file获取 XML 文件中元素的所有属性
【发布时间】:2013-04-02 04:58:51
【问题描述】:

我正在尝试解析文件并获取文件中每个<row> 标记的所有属性。该文件通常如下所示:

<?xml version="1.0" standalone="yes"?>
<report>
  <table>
    <columns>
      <column name="month"/>
      <column name="campaign"/>
      <!-- many columns -->
    </columns>
    <rows>
  <row month="December 2009" campaign="Campaign #1" 
       adgroup="Python" preview="Not available" 
       headline="We Write Apps in Python" 
       and="many more attributes here" />
  <row month="December 2009" campaign="Campaign #1" 
       adgroup="Ruby" preview="Not available" 
       headline="We Write Apps in Ruby" 
       and="many more attributes here" />
  <!-- many such rows -->
</rows></table></report>

这是完整文件:http://pastie.org/7268456#2

我查看了可以在各种帮助板上找到的每个教程和答案,但它们都假设相同 - 我正在搜索一两个特定标签,而这些标签只需要一两个值。实际上,每个&lt;row&gt; 标记都有 18 个属性,并且我有一个 mysql 表,其中 18 个属性中的每一个都有一个列。我需要将信息放入一个对象/哈希/数组中,我可以使用它通过 ActiveRecord/Ruby 插入到表中。

我开始使用 Hpricot;您可以在此问题的编辑历史记录中看到代码(不相关)。

【问题讨论】:

  • 不要使用指向您的 XML 的链接。 WHEN 链接破坏了您的问题对于将来搜索相同问题将毫无价值。相反,嵌入演示问题所需的最小 XML。此外,使用链接会迫使我们寻找回答您的问题所需的材料。我们没有报酬,我们是志愿者,你假设我们会这样做是在浪费我们的时间,所以,请给我们需要帮助你的东西。
  • 另外,您的标签、标题和问题文本说 Nokogiri,但您的来源仅适用于 Hpricot。您是否尝试过使用 Nokogiri?如果是这样,该代码在哪里?我希望您不要期望有人会为您编写/移植代码。同样,您需要向我们提供帮助您所需的信息。
  • 我是网络抓取的新手,不幸的是,我意识到我正在阅读一本已经过时的书(使用 ruby​​ 和 rails 第 13 章进行实用报告),而且我每时每刻都会遇到代码不起作用的例子。我在 irb 中使用 Nokogiri,不幸的是,昨天经历了 12 个小时的挫折之后,我关闭了我的电脑,我所有的 nokogiri 代码都不见了。我会尝试重新创建它并回到我再次发布之前的位置。感谢您吸取的教训,我很抱歉浪费大家的时间......
  • 规则一,不要用 IRB 或任何其他语言的任何其他 REPL 编写代码。在编辑器中编写代码并保存文件后,在其中测试 sn-p 想法。规则二:不要相信计算机是稳定的,因为它们不是,有些事情需要更长的时间才能崩溃,但所有软件最终都会达到某种熵,要么被锁定,要么完全混乱并爆炸。 hPricot 是多年前的旧热点,但 Nokogiri 是新的热点,并且仍然如此。而且,互联网是一个巨大的垃圾堆,所以要小心你捡起或踩到的东西;旧东西开始闻起来。

标签: ruby nokogiri


【解决方案1】:
require 'nokogiri'
doc = Nokogiri.XML(my_xml_string)
doc.css('row').each do |row|
  # row is a Nokogiri::XML::Element
  row.attributes.each do |name,attr|
     # name is a string
     # attr is a Nokogiri::XML::Attr
    p name => attr.value
  end
end
#=> {"month"=>"December 2009"}
#=> {"campaign"=>"Campaign #1"}
#=> {"adgroup"=>"Python"}
#=> {"preview"=>"Not available"}
#=> {"headline"=>"We Write Apps in Python"}
#=> etc.

或者,如果您只想要一个将属性名称映射到字符串值的哈希数组:

rows = doc.css('row').map{ |row| Hash[ row.attributes.map{|n,a| [n,a.value]} ] }
#=> [
#=>  {"month"=>"December 2009", "campaign"=>"Campaign #1", adgroup="Python", … },
#=>  {"month"=>"December 2009", "campaign"=>"Campaign #1", adgroup="Ruby", … },
#=>  …
#=> ]

Nokogiri.XML 方法是解析 XML 字符串并返回 Nokogiri::Document 的最简单方法。

css 方法是查找具有给定名称的所有元素的最简单方法(忽略它们的包含层次结构和任何 XML 命名空间)。它返回一个Nokogiri::XML::NodeSet,与数组非常相似。

每个Nokogiri::XML::Element 都有一个attributes 方法,该方法返回一个哈希值,将属性名称映射到一个Nokogiri::XML::Attr 对象,该对象包含有关属性的所有信息(名称、值、命名空间、父元素等)

【讨论】:

  • 你是绝对的救星!非常感谢你帮助我看到一个真正有效的例子!它确实帮助我克服了挫败感,我可以重新开始学习,我欠你一大笔钱! (两个例子都完美无缺)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-26
  • 2022-01-13
  • 1970-01-01
  • 2011-05-07
  • 1970-01-01
  • 1970-01-01
  • 2011-10-10
相关资源
最近更新 更多