2012-05-07 98 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?}