2012-10-09 45 views
0

我正在個人項目和使用Rails學習框架。該項目是基於音樂的,我使用ChartLyrics.com的API來檢索歌詞。 API返回XML,我無法從XML中提取實際的歌詞元素。我需要幫助從XML中提取值在ruby/rails

我已經安裝了Nokogiri gem來幫助解析XML。以下是我用來檢索數據的內容。從軌道控制檯:

doc = Nokogiri::XML(open(http://api.chartlyrics.com/apiv1.asmx/SearchLyricDirect?artist=michael%20jackson&song=bad)) 
puts doc 

<?xml version="1.0" encoding="utf-8"?> 
<GetLyricResult xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://api.chartlyrics.com/"> 
    <TrackId>0</TrackId> 
    <LyricChecksum>a4a56a99ee00cd8e67872a7764d6f9c6</LyricChecksum> 
    <LyricId>1710</LyricId> 
    <LyricSong>Bad</LyricSong> 
    <LyricArtist>Michael Jackson</LyricArtist> 
    <LyricUrl>http://www.chartlyrics.com/28h-8gWvNk-Rbj1X-R7PXg/Bad.aspx</LyricUrl> 
    <LyricCovertArtUrl>http://ec1.images-amazon.com/images/P/B000CNET66.02.MZZZZZZZ.jpg</LyricCovertArtUrl> 
    <LyricRank>9</LyricRank> 
    <LyricCorrectUrl>http://www.chartlyrics.com/app/correct.aspx?lid=MQA3ADEAMAA=</LyricCorrectUrl> 
    <Lyric> 
    Because I'm bad (bad-bad), I'm bad, come on (really, really bad) 
    You know I'm bad (bad-bad), I'm bad, you know it (really, really bad) 
    You know I'm bad (bad-bad), I'm bad, you know it (really, really bad) you know 
    And the whole world has to answer right now 
    Just to tell you once again 
    </Lyric> 
</GetLyricResult> 

我縮短了歌詞,以節省空間。我如何提取'抒情'元素?我試過以下所有內容:

> lyrics = doc.xpath('//Lyric') 
=> [] 

> lyrics = doc.xpath('/Lyric') 
=> [] 

> lyrics = doc.xpath('//GetLyricResult/Lyric') 
=> [] 

> lyrics = doc.xpath('//GetLyricResult//Lyric') 
=> [] 

> lyrics = doc.xpath('/GetLyricResult/Lyric') 
=> [] 

'歌詞'每次都是零。誰能告訴我我做錯了什麼?由於

回答

2

默認情況下,引入nokogiri查找不在任何名稱空間的元素,但是這個文件命名空間:

doc.namespaces 
#=> {"xmlns:xsi"=>"http://www.w3.org/2001/XMLSchema-instance", "xmlns:xsd"=>"http://www.w3.org/2001/XMLSchema", "xmlns"=>"http://api.chartlyrics.com/"} 

所以,你必須要追加xmlns命名空間,你要搜索的標籤(你可以離開了實際的URL,因爲nokogiri will fill in the URL for the default namespace in for you):

doc.css('Lyric') 

doc.xpath('//xmlns:Lyric') 

另外,您可以使用CSS搜索

另請參閱:Why doesn't Nokogiri xpath like xmlns declarations

+0

工作!非常感謝shioyama! PHP對命名空間並不着迷。應該知道。 – ericwindham

+0

命名空間在處理複雜的XML時是非常必要的。對於普通的XML來說,它們是巨大的矯枉過正,並且讓人們不知所措。 Nokogiri使用CSS來繞過命名空間問題是一個不錯的結冰層,也是爲什麼我更喜歡在解析時使用CSS over XPath的原因之一。 –