2013-09-23 115 views
1

我一直在尋找一種方式來找到具有特定屬性的元素節點,發現: 「Use Nokogiri to get all nodes in an element that contain a specific attribute name如何獲取包含冒號的特定屬性的節點?

但是,它不當屬性有一個冒號,例如工作「富:酒吧」作爲

​​

(是的,它的有效性)。

然而,當我使用:

elements = @doc.xpath("//*[@foo:bar]") 

我得到:

unexpected ':' after '#<Nokogiri::CSS::Node:0x107458870>' (Nokogiri::CSS::SyntaxError) 

而且,當我使用:

elements = @doc.xpath("//*[@foo\\:bar]") 

我得到:

Invalid predicate: //*[@foo\:bar] (Nokogiri::XML::XPath::SyntaxError) 

有沒有人有任何建議?

$ nokogiri -v 
# Nokogiri (1.5.6) 
--- 
nokogiri: 1.5.6 
warnings: [] 

ruby: 
    version: 1.8.7 
    engine: mri 
    description: ruby 1.8.7 (2012-02-08 patchlevel 358) [universal-darwin11.0] 
    platform: universal-darwin11.0 
libxml: 
    loaded: 2.7.3 
    compiled: 2.7.3 
    binding: extension 

這些舊版本?

+1

您使用的是Ruby,Nokogiri和LibXML的哪個版本?在命令行鍵入'nokogiri -v',並通過編輯將該信息追加到您的問題中。 –

+0

這不是冒號的屬性,它是一個命名空間。如果名稱空間未在根節點上註冊,則必須自行註冊。 –

回答

1

它應該工作。請參閱以下示例代碼:

require 'nokogiri' 
doc = Nokogiri::XML('<root xmlns:foo="http://www.example.com/"><abc foo:bar="hello"></abc></root>') 
doc.xpath('//*[@foo:bar]') 
# => #<Nokogiri::XML::Document:0x61ca74 name="document" children=[#<Nokogiri::XML::Element:0x61c63c name="root" children=[#<Nokogiri::XML::Element:0x61c3e4 name="abc" attributes=[#<Nokogiri::XML::Attr:0x61c36c name="bar" namespace=#<Nokogiri::XML::Namespace:0x61c088 prefix="foo" href="http://www.example.com/"> value="hello">]>]>]> 
+0

這僅適用於您在根節點上定義了名稱空間。如果在其他地方定義了,'xpath()'方法必須附加名稱空間信息。 –

相關問題