2012-05-07 139 views
13

我看到的這幾件事情,但沒有什麼似乎已工作至今讓在XML文件中的CDATA標籤內的內容。我解析一個XML通過使用nokogiri軌道上的3 ruby​​ 1.9.2。嘗試使用引入nokogiri

的XML的一個片段是這樣的:

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

我試圖解析了這一點,以獲得與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 

我得到的回報是

<newslinetext></newslinetext> 
NOTHING 
NOTHING 

所以我知道我的標籤被命名爲/拼寫正確獲得在newslinetext數據,但CDATA文字從不出現。

我需要做什麼用引入nokogiri做的就是這樣的文字?

+0

看你的情況,我相信會引入nokogiri HTML downcase名字,但不是XML – pguardiario

+0

@pguardiario:亞倫採用引入nokogiri的HTML解析器,而不是它的XML解析器。 –

+0

你們都是對的。我無意中使用了HTML解析器,它迫使我使用小寫字母。然後當我嘗試使用XML解析器時,我沒有得到任何結果(因爲我已經使用小寫)。在看到這裏的答案之後,我意識到自己的白癡並轉而區分大小寫和XML。完美的作品。謝謝 –

回答

11

你試圖使用引入nokogiri的HMTL解析器來解析XML。如果node作爲來自XML解析器然後rnil因爲XML是大小寫敏感的;您的r不是nil,因此您使用的是不區分大小寫的HTML解析器。

使用引入nokogiri的XML解析器,你會得到這樣的事情:

>> 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" 

,你就能夠在CDATA通過r.textr.children得到。

+0

巴..我使用的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?}