选择名称以某个字符串开头的所有XML元素?

时间:2015-07-08 18:14:16

标签: ruby-on-rails ruby xml xpath nokogiri

我有两个元素,itemdate

  • item has_many dates
  • date belongs_to item

我有一个XML树的文件,如下所示:

<content>
  <item_1>
    <title>
    <description>
    <date_1>
      <date></date>
      <count></count>
    </date_1>
    <date_2>
      <date></date>
      <count></count>
    </date_2>
  </item_1>
  <item_2>
    <title>
    <description>
    <date_1>
      <date></date>
      <count></count>
    </date_1>
    <date_2>
      <date></date>
      <count></count>
    </date_2>
  </item_2>
</content>

我使用Nokogiri解析来自itemdate的数据。 我写了一半脚本,它创建了元素:

doc.xpath("//content/*").each do |item|
  Item.create!(
              title: item.xpath("title").text,
              description: item.xpath("description").text)
end

现在我需要找到并构建项目的所有日期(元素date),但无法理解如何解析<data_1><data_2><data_3>等标记等等 我在尝试什么

  tour.xpath("//*/data_*").each do |date|
    puts date
  end

  tour.xpath{ |i| "//*/data_#{i}" }.each do |date|
    puts date
  end

但它不起作用或我收到错误。

2 个答案:

答案 0 :(得分:6)

用于选择文档中所有date元素的XPath,无论其遗产如何,都只是:

//date

用于选择名称以&#34; date _&#34;开头的所有元素的XPath;是:

//*[starts-with(local-name(), 'date_')]

请参阅starts-with()local-name()

答案 1 :(得分:2)

试试这个:

doc.xpath("//content/*").each do |item|
  ...
  item.xpath("./*[starts-with(local-name(), 'date_')]").each do |d|
    ...
  end
end

(根据@kjhughes建议剪辑剪辑)