ย้ายบล็อกไปที่ bact.cc แล้วนะครับ

พ.ร.บ.คอมพิวเตอร์
หยุด ร่างพ.ร.บ.คอมพิวเตอร์
พื้นที่เก็บข้อมูลออนไลน์ ฟรี 2GB จาก Dropbox (sync กับ Windows, Linux, Mac, iPhone, Android ฯลฯ ได้)

2006-04-03

REXML Nodes and Elements

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:

PPhetra said...

งงๆ ตาม 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

bact' said...

แป่ววววว ใช้ #each ตั้งแต่แรกก็หมดเรื่องแย้ววว - -"

เออ เนอะ หัวเราคงยังไม่เป็น Ruby จริง ๆ ด้วย
ไม่งั้นคงต้องลอง each ไปก่อนเปิด api doc แล้ว

ขอบคุณครับ

ว่าแต่ ... ฮ่ะ ๆ javadoc rulez !