2011-04-09 54 views
1

我在探索Nokogiri並遇到了令人困惑的問題,我會欣賞某人的意見。注意我對Ruby也是一個相當新的東西,所以我期待着做一些非常愚蠢的事情。如果是這樣的話,道歉。xpath和css查詢之間的不同結果

我有一個簡單的測試,比較XML文檔上的XPath查詢和CSS查詢的結果。 CSS查詢的工作原理,但XPath不,我不知道爲什麼。

should "get same result from Nokogiri using XPath or CSS syntax" do 

    xml_source = "<?xml version=\"1.0\" encoding=\"utf-8\"?><accounts xmlns=\"http://api.esendex.com/ns/\"><account id=\"2b4a326c-41de-4a57-a577-c7d742dc145c\" uri=\"http://api.esendex.com/v1.0/accounts/2b4a326c-41de-4a57-a577-c7d742dc145c\"><messagesremaining>100</messagesremaining></account></accounts>" 

    ndoc = Nokogiri::XML(xml_source) 

    node_value = ndoc.css("accounts account messagesremaining").count 
    assert_equal 1, node_value 

    node_value = ndoc.xpath("//accounts//account//messagesremaining").count 
    assert_equal 1, node_value 

    end 

第二斷言失敗與node_value等於零。

在此先感謝。

回答

1

你有兩個問題。

首先xpath應該是「// accounts/account/messagesremaining」。

其次你有一個默認的命名空間「http:// api ...」。您需要在執行xpath查詢時指定每個元素的名稱空間(css查詢忽略名稱空間)。

對不起,我不知道Nokogiri,但我有一些關於如何在xpath查詢中使用名稱空間的文檔。

+0

感謝Richard,命名空間是關鍵問題。我沒有考慮它,因爲它是默認的。我的錯。 XPath在我添加命名空間引用時起作用,因爲我在使用帶引號的字符串時正在跳過斜槓。儘管一開始就加倍表示根,但我知道它使效率更高。 'node_value = ndoc.xpath('// api:accounts/api:account/api:messagesremaining','api'=>'http://api.esendex.com/ns/').count' – adambird 2011-04-10 09:38:46

+0

「我有它如何在xpath查詢上使用名稱空間的文檔「。 Nokogiri確實有[documententation](http://nokogiri.org/tutorials/searching_a_xml_html_document.html)如何與他們合作。 CSS的好處是它會自動應用'xmlns'命名空間。 – 2011-04-10 21:51:49