rexml page.root.has_elements? говорит нет элементов

Я попытался прочитать следующий файл:

с кодом ниже:

require 'rexml/document'
include REXML

str = File.read("../pages/prac.xml").gsub(/\s+/, " ")

page = REXML::Document.new(str)
print "no elements\n" if page.root.has_elements?
print "Text: #{page.root.text}\n"
print "Name: #{page.root.name}\n"

page.root.each_element do |parent_tag|
    parent_tag.each_element do |tag|
        if tag.has_elements?
            tag.each_element do |data|
                p data
            end
        else
            puts "#{tag.name}: #{tag.text}"
        end
    end
end

Результат, который я вижу:

no elements
Text:  
Name: html

Может ли кто-нибудь помочь мне, указав, что здесь не так?


person Karthick S    schedule 30.05.2012    source источник
comment
Любой пример файла str или содержимого файла prac.xml?   -  person MBO    schedule 30.05.2012


Ответы (1)


print "no elements\n" if page.root.has_elements?

page.root.has_elements? возвращает true, если у корневого элемента есть дочерние элементы. В вашем случае вы печатаете «нет элементов», когда корневой элемент находит дочерние элементы. Вместо этого, вероятно, следует читать «имеет элементы», поскольку это вводит в заблуждение, как написано.

Во-вторых, вывод из page.root.name относится к имени корневого элемента XML-документа и, следовательно, в вашем случае выводит «html». Однако page.root.text возвращает первый текстовый узел (не текст дочернего элемента), который, вероятно, является пустым пространством и, следовательно, ничего не отображает.

person rbnewb    schedule 30.05.2012
comment
Спасибо за ответ rbnewb. В xml нет ошибки (Проверено онлайн): ‹html› ‹head› Одна строка ‹/head› ‹/html› Я не могу понять, почему в данном случае нет дочерних элементов для html. - person Karthick S; 02.06.2012
comment
Используя ваш пример xml, я смог вернуть текст тега заголовка. Я открыл новый сеанс irb и ввел следующее (каждая строка разделена запятой ниже): require 'rexml/document', включить REXML, s = '‹html › ‹head› Одна строка ‹/head› ‹/html›', doc = Document.new(s), head_tag ​​= doc.root.get_elements('// head'), помещает head_tag.first.text, и я получаю результат Одна строка. Вы также можете использовать doc.root.children.each {|n| помещает n} (где doc — документ REXML) для вывода всех дочерних элементов корневого узла, чтобы лучше понять, что видит REXML. - person rbnewb; 03.06.2012
comment
Спасибо. Вместо использования page.root.children.each я использовал page.root.elements.size(). Это работало нормально. - person Karthick S; 03.06.2012