nokogiri可以使用可选标签处理css选择器吗?

时间:2015-10-13 13:23:08

标签: ruby xml-parsing nokogiri

是否可以在nokogiri中使用两个可选标签定义css选择器?

作为(不工作)的例子:

  document.css('/hello-world [greeting|gruss]').each{|g| 
    ...
  }

我想以正确的顺序获得所有'问候'和'gruss'标签。

完整的最小不工作示例:

XML = <<-XML
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="hello.xsl"?>
<hello-world>   
  <greeting>Hello, World!</greeting>
  <gruss>Hallo, Welt!</gruss>
</hello-world>
XML

require 'nokogiri'

document = Nokogiri::XML(XML)
[
#This two are working, but it is in two different loops:
  '/hello-world greeting',
  '/hello-world gruss',
#This does not work:
  '/hello-world [greeting|gruss]',  #Does not work
].each{|css_path|
  puts "Scan css path '%s':" % css_path
  document.css(css_path).each{|g| puts "  Found: %s" % g.content }
}

结果是:

Scan css path '/hello-world greeting':
  Found: Hello, World!
Scan css path '/hello-world gruss':
  Found: Hallo, Welt!
Scan css path '/hello-world [greeting|gruss]':

最后的css-elements以Nokogiri :: XML :: XPath :: SyntaxError结尾。是否有可能使用一个css选择器获取两个标签中的所有元素?

1 个答案:

答案 0 :(得分:2)

在CSS中,您只需使用逗号选择多个节点:

document.css 'greeting, gruss'

如果您想要更具体,则需要重复整个选择器:

document.css 'hello-world greeting, hello-world gruss'

目前没有办法缩短这一点(像any psuedo-class这样的东西可行,但在Nokogiri中不可用)。

在XPath中,您可以执行类似

的操作
document.xpath '//hello-world//*[name() = "greeting" or name() = "gruss"]'

这不是更短,但意味着您避免重复查询的第一部分。

如果你计划做很多事情,你也可以考虑创建一个自定义函数,可以在CSS或XPath中使用。