2011-04-09 5 views
1

나는 Nokogiri를 탐색 중이며 복잡한 문제를 접하게됩니다. NB 또한 루비에 대해 상당히 새로운 것입니다. 그래서 정말 재치있는 일을 할 것으로 기대하고 있습니다. 그렇다면 죄송합니다.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는 0입니다.

미리 감사드립니다.

답변

1

두 가지 문제가 있습니다.

먼저 xpath는 "// accounts/account/messagesremaining"이어야합니다.

두 번째로 기본 네임 스페이스 "http : // api ..."가 있습니다. xpath 쿼리를 수행 할 때 각 요소의 네임 스페이스를 지정해야합니다 (css 쿼리는 네임 스페이스를 무시합니다).

죄송합니다. Nokogiri를 모르지만 xpath 쿼리에서 네임 스페이스를 사용하는 방법에 대한 문서가 있습니다.

+0

Richard 님, 네임 스페이스가 주요 문제였습니다. 그것이 기본값이기 때문에 나는 그것을 고려하지 않았다. 내 잘못이야. XPath는 인용 된 문자열을 사용하면서 슬래시를 이스케이프 처리했기 때문에 네임 스페이스 참조를 추가 할 때 작동했습니다. 처음에는 루트를 나타내는 것을 두 배로 늘 렸지만 더 효율적인 것으로 알고 있습니다. 'node_value = ndoc.xpath ('api : accounts/api : accounts/api : messagesremaining ','api '=>'http://api.esendex.com/ns/ ')' – adambird

+0

' xpath 쿼리에서 네임 스페이스를 사용하는 방법에 대한 문서가 있습니다. " Nokogiri에는 [documententation] (http://nokogiri.org/tutorials/searching_a_xml_html_document.html)이 있습니다. CSS의 이점은'xmlns' 네임 스페이스를 자동으로 적용한다는 것입니다. –

관련 문제