2012-05-07 34 views
13

私はこれについていくつかのことを見てきましたが、これまでに何も動作していないようです。私は3つのルビー1.9.2でnokogiriを使用してURLを介してXMLを解析しています。私はNewsLineTextに関連付けられたテキストを取得するには、このを解析しようとしていますnokogiriを使ってxmlファイル内のcdataタグ内のコンテンツを取得しようとしました

<NewsLineText> 
    <![CDATA[ 
    Anna Kendrick is ''obsessed'' with 'Game of Thrones' and loves to cook, particularly  creme brulee. 
    ]]> 
</NewsLineText> 

を私は何を見返りに取得することです
r = node.at_xpath('.//newslinetext') if node.at_xpath('.//newslinetext') 
s = node.at_xpath('.//newslinetext').text if node.at_xpath('.//newslinetext') 
t = node.at_xpath('.//newslinetext').content if node.at_xpath('.//newslinetext') 
puts r 
puts s ? if s.blank? 'NOTHING' : s 
puts t ? if t.blank? 'NOTHING' : t 

XMLの抜粋は次のようになります

<newslinetext></newslinetext> 
NOTHING 
NOTHING 

私は自分のタグがnewslinetextデータを取得するために正しく名前が付けられていることを知っていますが、cdataテキストは表示されません。

このテキストを取得するには、何が必要ですか?

+0

があなたのケースを見て、私は鋸山は、HTMLの名前をdowncaseであろうが信じられないのxml – pguardiario

+0

@pguardiario:アーロンは鋸山のHTMLパーサではなく、そのXMLパーサーを使用しています。 –

+0

あなたはすべて正しいです。私は意図せず小文字を使用するHTMLパーサを使用していました。その後、XMLパーサを使用しようとしたとき、結果は得られませんでした(すでに小文字を使用していたため)。ここで答えを見た後、私は馬鹿馬鹿しくし、大文字と小文字の区別とXMLに切り替えました。完璧に動作します。ありがとうございました –

答えて

11

あなたはNokogiriのHMTLパーサーを使用してXMLを解析しようとしています。 nodeがXMLパーサーの場合、rnilとなります。XMLは大文字と小文字が区別されるためです。 はnilではないので、大文字と小文字を区別しないHTMLパーサを使用しています。

>> r = doc.at_xpath('.//NewsLineText') 
=> #<Nokogiri::XML::Element:0x8066ad34 name="NewsLineText" children=[#<Nokogiri::XML::Text:0x8066aac8 "\n ">, #<Nokogiri::XML::CDATA:0x8066a9c4 "\n Anna Kendrick is ''obsessed'' with 'Game of Thrones' and loves to cook, particularly  creme brulee.\n ">, #<Nokogiri::XML::Text:0x8066a8d4 "\n">]> 
>> r.text 
=> "\n \n Anna Kendrick is ''obsessed'' with 'Game of Thrones' and loves to cook, particularly  creme brulee.\n \n" 

を、あなたはr.textまたはr.childrenを通じてCDATAで取得することができます:

使用鋸山のXMLパーサーとあなたはこのようなものを取得します。

+0

Bah ..私はHTMLを使用していて大文字と小文字を区別しようとしましたが、結果が得られませんでした。後でNokogiriのXMLパーサを使ってみましたが、大文字小文字を無視して結果を返しませんでした。 XMLと大文字と小文字を区別して試してみるべきだったと思います。これを確認して結果をお知らせします。 –

+0

あなたはすべて正しいです。私は意図せず小文字を使用するHTMLパーサを使用していました。その後、XMLパーサを使用しようとしたとき、結果は得られませんでした(すでに小文字を使用していたため)。ここで答えを見た後、私は馬鹿馬鹿しくし、大文字と小文字の区別とXMLに切り替えました。完璧に動作します。ありがとう –

+0

nokogiri_doc_object.xpath( "/ root/element")。children [0] .text – Alex

3

わかりました。 @muが正しいと言いました。しかし、おそらく、直接CDATAで取得するには:

xml =<<EOF 
<NewsLineText> 
    <![CDATA[ 
    Anna Kendrick is ''obsessed'' with 'Game of Thrones' and loves to cook, particularly  creme brulee. 
    ]]> 
</NewsLineText> 
EOF 
node = Nokogiri::XML xml 
cdata = node.search('NewsLineText').children.find{|e| e.cdata?} 
関連する問題