2013-06-26 2 views
0

Моего кода:Xpath.each не работает в рельсах

require 'rexml/document' 
require 'xpath' 

doc = REXML::Document.new(xml) 
XPath.each(doc, "*/categoryName") { |element| puts element.text } 

Я пытаюсь взять объект XML, где XML является строкой XML ... и получить какой-то текст ИЭ - Я хочу, чтобы этот текст

Я думал, что приведенный выше код будет работать, но он дает мне следующую ошибку:

undefined method `each' for XPath:Module 
+0

Использование [Nokogiri] (http://nokogiri.org) вместо того, чтобы: 'док = Nokogiri.XML (XML); puts doc.xpath ('*/categoryName'). map (&: text) ' – Phrogz

ответ

0

Я думаю, что вы пропустили require rexml/xpath и попробовать REXML::XPath.each. Это будет работать.

require 'rexml/document' 
require 'rexml/xpath' 
doc = REXML::Document.new(xml) 
REXML::XPath.each(doc, "*/category") { |element| puts element.text } 

Один пример:

require 'rexml/document' 
require 'rexml/xpath' 

doc = REXML::Document.new("<p>some text <b>this is bold!</b> more text</p>") 
REXML::XPath.each(doc, "*//b") { |element| puts element.text } 
# >> this is bold! 
1

Я не уверен, что «XPath» библиотека вы загружаете, но вы не хотите или нужно. Смысл в том, что документация REXML предполагает, что вы «загрязнили» свой глобальный объект через include REXML. Так как вы не делаете этого, вы должны указать полный путь к модулю:

require 'rexml/document' 
doc = REXML::Document.new(xml) 
REXML::XPath.each(doc, "*/category"){ |el| puts el.text }