0

私は個人的なプロジェクトに取り組んでおり、Rails を使用してフレームワークを学習しています。このプロジェクトは音楽ベースで、ChartLyrics.com の API を使用して歌詞を取得しています。API は XML を返しますが、XML から実際の歌詞要素を抽出するのに問題があります。

XML の解析に役立つ Nokogiri gem をインストールしました。以下は、データを取得するために使用しているものです。Rails コンソールから:

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')
=> []

「歌詞」は毎回ゼロです。誰が私が間違っているのか教えてもらえますか? ありがとう

4

1 に答える 1

3

デフォルトでは、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そのため、検索するタグに名前空間を追加する必要があります ( nokogiri がデフォルトの名前空間の URL を入力してくれるので、実際の URL は省略できます)。

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

または、css を使用して検索することもできます。

doc.css('Lyric')

参照: Nokogiri xpath が xmlns 宣言のようにならない理由

于 2012-10-09T04:26:53.757 に答える