2015-10-13 150 views
0

是否可以使用兩個可選標籤在nokogiri中定義一個css選擇器?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元素與引入nokogiri :: XML :: XPath的:: SyntaxError錯誤結束。是否有可能使用一個CSS選擇器獲取兩個標籤中的所有元素?

+0

我找到了一個解決方案:使用'./hello-world//greeting | ./hello-world // gruss''作爲xpath ..但是我用css尋找解決方案。 – knut

回答

1

在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中使用。

相關問題