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 Nokogiri和按名称查找元素_Ruby_Xml_Nokogiri_Xml Parsing - Fatal编程技术网

Ruby Nokogiri和按名称查找元素

Ruby Nokogiri和按名称查找元素,ruby,xml,nokogiri,xml-parsing,Ruby,Xml,Nokogiri,Xml Parsing,我正在使用Nokogiri解析一个XML文件,其中包含以下代码段: doc.xpath('//root').each do |root| puts "# ROOT found" root.xpath('//page').each do |page| puts "## PAGE found / #{page['id']} / #{page['name']} / #{page['width']} / #{page['height']}" page.children.each

我正在使用Nokogiri解析一个XML文件,其中包含以下代码段:

doc.xpath('//root').each do |root|
  puts "# ROOT found"
  root.xpath('//page').each do |page|
    puts "## PAGE found / #{page['id']} / #{page['name']} / #{page['width']} / #{page['height']}"
    page.children.each do |content|
      ...
    end
  end
end

如何解析页面元素中的所有元素?有三种不同的元素:图像、文本和视频。我怎样才能为每个元素做一个案例陈述呢?

老实说,你看起来和我很接近

doc.xpath('//root').each do |root|
  puts "# ROOT found"
  root.xpath('//page').each do |page|
    puts "## PAGE found / #{page['id']} / #{page['name']} / #{page['width']} / #{page['height']}"
    page.children.each do |child|
      case child.name
       when 'image'  
          do_image_stuff
       when 'text'
          do_text_stuff
       when 'video'
          do_video_stuff
       end
    end
  end
end

Nokogiri的CSS和XPath访问器都允许指定多个标记,这对于此类问题非常有用。而不是浏览文档的
页面中的每个标记
标记:

require 'nokogiri'

doc = Nokogiri::XML('
  <xml>
  <body>
  <image>image</image>
  <text>text</text>
  <video>video</video>
  <other>other</other>
  <image>image</image>
  <text>text</text>
  <video>video</video>
  <other>other</other>
  </body>
  </xml>')
注意,它按照CSS访问器指定的顺序返回标记。如果需要文档中标记的顺序,可以使用XPath:

doc.search('//image | //text | //video').each do |node|
  puts node.text
end

# >> image
# >> text
# >> video
# >> image
# >> text
# >> video
无论哪种情况,程序都应该运行得更快,因为所有的搜索都是在libXML中进行的,只返回Ruby处理所需的节点

如果需要将搜索限制在
标记内,可以先搜索
页面
节点,然后在其下方搜索:

doc.at('page').search('image, text, video').each do |node|
  ...
end


谢谢实际上是自己用matches?(选择器)方法解决的:)
doc.at('page').search('image, text, video').each do |node|
  ...
end
doc.at('//page').search('//image | //text | //video').each do |node|
  ...
end