2012-05-07 30 views
13

Tôi đã thấy một vài điều về điều này, nhưng không có gì có vẻ hoạt động cho đến nay. Tôi đang phân tích cú pháp xml qua url bằng cách sử dụng nokogiri trên đường ray 3 ruby ​​1.9.2.cố gắng lấy nội dung bên trong các thẻ cdata trong tệp xml bằng nokogiri

Một đoạn xml trông như thế này:

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

Tôi cố gắng để phân tích này ra để có được những văn bản liên quan đến việc 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 

Những gì tôi có được đổi lại là

<newslinetext></newslinetext> 
NOTHING 
NOTHING 

Vì vậy, tôi biết thẻ của mình được đặt tên/viết đúng chính tả để nhận dữ liệu tin tức văn bản, nhưng cdata văn bản không bao giờ xuất hiện.

Tôi cần làm gì với nokogiri để nhận được văn bản này?

+0

xem trường hợp của bạn, tôi tin rằng nokogiri sẽ downcase tên html nhưng không xml – pguardiario

+0

@pguardiario: Aaron đang sử dụng phân tích cú pháp HTML Nokogiri, không phân tích cú pháp XML của nó. –

+0

Bạn đã chính xác. Tôi đã vô tình sử dụng trình phân tích cú pháp HTML đã buộc tôi sử dụng chữ thường. Sau đó, khi tôi cố gắng sử dụng trình phân tích cú pháp XML, tôi không có kết quả (vì tôi đã sử dụng chữ thường). Sau khi nhìn thấy câu trả lời ở đây, tôi nhận ra sự ngu ngốc của tôi và chuyển sang độ nhạy và XML. Hoạt động hoàn hảo. cảm ơn –

Trả lời

11

Bạn đang cố gắng phân tích cú pháp XML bằng cách sử dụng trình phân tích cú pháp HMTL của Nokogiri. Nếu node từ trình phân tích cú pháp XML thì r sẽ là nil vì XML phân biệt chữ hoa chữ thường; r của bạn không phải là nil do đó bạn đang sử dụng trình phân tích cú pháp HTML không phân biệt chữ hoa chữ thường.

phân tích cú pháp XML Sử dụng Nokogiri và bạn sẽ có được những điều như thế này:

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

và bạn sẽ có thể để có được tại CDATA qua r.text hoặc r.children.

+0

Bah .. Tôi đã sử dụng HTML và cố gắng phân biệt chữ hoa chữ thường và nó không cho tôi kết quả nào và tôi không thể hiểu tại sao tôi bỏ tất cả xuống chữ thường làm việc. Sau đó, tôi đã thử sử dụng trình phân tích cú pháp XML của Nokogiri, nhưng tôi đã bỏ qua nó và không trả về kết quả nào. Tôi cho rằng tôi nên thử XML và phân biệt chữ hoa chữ thường và nó sẽ làm việc với những gì tôi đang cố gắng. Tôi sẽ kiểm tra điều này và cho bạn biết kết quả. –

+0

Bạn đã chính xác. Tôi đã vô tình sử dụng trình phân tích cú pháp HTML đã buộc tôi sử dụng chữ thường. Sau đó, khi tôi cố gắng sử dụng trình phân tích cú pháp XML, tôi không có kết quả (vì tôi đã sử dụng chữ thường). Sau khi nhìn thấy câu trả lời ở đây, tôi nhận ra sự ngu ngốc của tôi và chuyển sang độ nhạy và XML. Hoạt động hoàn hảo. cảm ơn –

+0

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

3

Tôi hiểu rồi. Những gì @mu nói là chính xác. Nhưng để có được tại cdata trực tiếp, có thể:

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?} 
Các vấn đề liên quan