2011-04-09 33 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