REXML, a Ruby-style XML toolkit
What's the difference between results from code (1) and (2) below ?
(element
is an XML element)
Code (1), use Element#elements :
element.elements.each do |e|
puts e.inspect
end
Code (2), use Element#to_a :
element.to_a.each do |e|
puts e.inspect
end
Update: We can actually use just element.each
.. no .to_a
requied — thanks to P'Pok for this
Code (2) will give us texts, elements (as well as other nodes).
Where code (1) will give us only elements.
If our input is:
<p><b>bold</b> text</p>
Code (1) will give:
<b> ... </>
While code (2) will give:
<b> ... </>
" text"
This tiny difference already wasted me hours, shamed :(
I was thought that text is a kind of element, ... that's plain wrong,
both text and element are kinds of node !
For several REXML tutorials/examples I've found, where I copied and pasted codes from for my quick-n-dirty-self-education, all of them show only the use of Element#elements but not Element#to_a.
This is probably because all of them only deal with a data-oriented XML, where a use of 'mix content' is rare (and indeed not recommended). But that's no longer true for document/text-oriented XML — for example, XHTML.
If you going to process a XML with mix content, beware of #elements.
Correct me if I do anything wrong here.
REXML veteran? Share! ;)
Tutorials:
REXML Home |
XML.com |
developerWorks
API docs
2 comments:
งงๆ ตาม bact' ไปด้วย
(ว่า text เป็น element)
แวบไปดู javadoc org.w3c.dom มา
ก็เลยกระจ่าง
==================
interface Text extends Node
interface Element extends Node
==================
เสริมอีกนิด
Class Element มัน extend จาก class Parent
ซึ่งมัน include Enumerable ด้วย
ทำให้เราใช้อย่างนี้ได้ด้วย
element.each do |node|
puts node.inspect
end
แป่ววววว ใช้ #each ตั้งแต่แรกก็หมดเรื่องแย้ววว - -"
เออ เนอะ หัวเราคงยังไม่เป็น Ruby จริง ๆ ด้วย
ไม่งั้นคงต้องลอง each ไปก่อนเปิด api doc แล้ว
ขอบคุณครับ
ว่าแต่ ... ฮ่ะ ๆ javadoc rulez !
Post a Comment