2012-05-30 51 views
0

我試着閱讀下列文件: 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 

誰能幫我通過指出這裏出了什麼問題?

+0

「str」或「prac.xml」文件內容的任何檢查? – MBO

回答

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

page.root.has_elements?返回true如果根元素具有子元素。在你的情況下,當根元素找到子元素時,你正在打印「無元素」。它可能應該讀作「有元素」,因爲它是誤導性的。

其次,page.root.name的輸出引用了XML文檔的根元素的名稱,因此在您的情況下會打印出「html」。但是,page.root.text返回第一個文本節點(不是子元素的文本),這可能是空白區域,因此看起來不顯示任何內容。

+0

感謝您的回覆rbnewb。 有一個在XML中沒有錯誤(在網上查): \t \t一號線 \t 我無法理解爲什麼沒有孩子在這種情況下的HTML。 –

+0

使用你的例子xml我能夠返回頭標記文本。我打開了一個新的irb會話並輸入以下內容(每行用逗號分隔)__require'rexml/document'__,__include REXML__,__s ='一行'__,__doc = Document.new(s)__ ,__head_tag = doc.root.get_elements('// head')__,__puts head_tag.first.text__,我得到了__One line__的結果。您可能還想使用__doc.root.children.each {| n |把n} __(其中doc是一個REXML文檔)打印出根節點的所有子節點,以更好地理解REXML所看到的內容。 – rbnewb

+0

謝謝。我使用page.root.elements.size()來代替使​​用page.root.children.each。這工作得很好。 –