Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.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 on rails 选择名称以特定字符串开头的所有XML元素?_Ruby On Rails_Ruby_Xml_Xpath_Nokogiri - Fatal编程技术网

Ruby on rails 选择名称以特定字符串开头的所有XML元素?

Ruby on rails 选择名称以特定字符串开头的所有XML元素?,ruby-on-rails,ruby,xml,xpath,nokogiri,Ruby On Rails,Ruby,Xml,Xpath,Nokogiri,我有两个元素,项目和日期: 项目有很多日期 日期属于项目 我有一个XML树文件,如下所示: <content> <item_1> <title> <description> <date_1> <date></date> <count></count> </date_1> <date_2>

我有两个元素,
项目
日期

  • 项目
    有很多日期
  • 日期
    属于项目
我有一个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>
现在我需要找到并构建项目的所有日期(元素
date
),但无法理解如何解析标签,如
等。 我在尝试什么

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

但它不起作用,否则我会出错。

试试这个:

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

(根据@kjhughes的建议剪下编辑)

用于选择文档中所有
date
元素的XPath,不管它们的传统是什么,都是简单的:

//date

用于选择名称以“date\开头的所有元素的XPath是:


请参阅和。

“我出错”的意思是什么?它什么也没告诉我们。也许指定您得到的确切异常会有所帮助。这意味着regexp在xpath()中不起作用,虽然它应该起作用,但速度会慢一些。您要求Nokogiri返回
content
节点中的所有节点,然后让Ruby过滤掉它们。最好让“引擎”来完成这项工作,也就是说,让libXML或DBM尽可能地降低“命中率”以提高速度,然后使用减少的结果。同意。我将根据di@kjhughes的建议更新代码片段。
doc.xpath("//content/*").each do |item|
  ...
  item.xpath("./*[starts-with(local-name(), 'date_')]").each do |d|
    ...
  end
end
//date
//*[starts-with(local-name(), 'date_')]