rexml 3.2.3 → 3.2.8

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rexml might be problematic. Click here for more details.

@@ -0,0 +1,602 @@
1
+ == Class Element
2
+
3
+ Class Element has methods from its superclasses and included modules;
4
+ see:
5
+
6
+ - {Tasks for Parent}[parent_rdoc.html].
7
+ - {Tasks for Child}[child_rdoc.html].
8
+ - {Tasks for Node}[node_rdoc.html].
9
+ - {Module Enumerable}[https://docs.ruby-lang.org/en/master/Enumerable.html].
10
+
11
+ :include: ../tocs/element_toc.rdoc
12
+
13
+ === New Element
14
+
15
+ ==== Task: Create a Default Element
16
+
17
+ Use method
18
+ {Element::new}[../../../../REXML/Element.html#method-c-new]
19
+ with no arguments to create a default element:
20
+
21
+ e = REXML::Element.new
22
+ e.name # => "UNDEFINED"
23
+ e.parent # => nil
24
+ e.context # => nil
25
+
26
+ ==== Task: Create a Named Element
27
+
28
+ Use method
29
+ {Element::new}[../../../../REXML/Element.html#method-c-new]
30
+ with a string name argument
31
+ to create a named element:
32
+
33
+ e = REXML::Element.new('foo')
34
+ e.name # => "foo"
35
+ e.parent # => nil
36
+ e.context # => nil
37
+
38
+ ==== Task: Create an Element with Name and Parent
39
+
40
+ Use method
41
+ {Element::new}[../../../../REXML/Element.html#method-c-new]
42
+ with name and parent arguments
43
+ to create an element with name and parent:
44
+
45
+ p = REXML::Parent.new
46
+ e = REXML::Element.new('foo', p)
47
+ e.name # => "foo"
48
+ e.parent # => #<REXML::Parent @parent=nil, @children=[<foo/>]>
49
+ e.context # => nil
50
+
51
+ ==== Task: Create an Element with Name, Parent, and Context
52
+
53
+ Use method
54
+ {Element::new}[../../../../REXML/Element.html#method-c-new]
55
+ with name, parent, and context arguments
56
+ to create an element with name, parent, and context:
57
+
58
+ p = REXML::Parent.new
59
+ e = REXML::Element.new('foo', p, {compress_whitespace: :all})
60
+ e.name # => "foo"
61
+ e.parent # => #<REXML::Parent @parent=nil, @children=[<foo/>]>
62
+ e.context # => {:compress_whitespace=>:all}
63
+
64
+ ==== Task: Create a Shallow Clone
65
+
66
+ Use method
67
+ {Element#clone}[../../../../REXML/Element.html#method-i-clone]
68
+ to create a shallow clone of an element,
69
+ copying only the name, attributes, and context:
70
+
71
+ e0 = REXML::Element.new('foo', nil, {compress_whitespace: :all})
72
+ e0.add_attribute(REXML::Attribute.new('bar', 'baz'))
73
+ e0.context = {compress_whitespace: :all}
74
+ e1 = e0.clone # => <foo bar='baz'/>
75
+ e1.name # => "foo"
76
+ e1.context # => {:compress_whitespace=>:all}
77
+
78
+ === Attributes
79
+
80
+ ==== Task: Create and Add an Attribute
81
+
82
+ Use method
83
+ {Element#add_attribute}[../../../../REXML/Element.html#method-i-add_attribute]
84
+ to create and add an attribute:
85
+
86
+ e = REXML::Element.new
87
+ e.add_attribute('attr', 'value') # => "value"
88
+ e['attr'] # => "value"
89
+ e.add_attribute('attr', 'VALUE') # => "VALUE"
90
+ e['attr'] # => "VALUE"
91
+
92
+ ==== Task: Add an Existing Attribute
93
+
94
+ Use method
95
+ {Element#add_attribute}[../../../../REXML/Element.html#method-i-add_attribute]
96
+ to add an existing attribute:
97
+
98
+ e = REXML::Element.new
99
+ a = REXML::Attribute.new('attr', 'value')
100
+ e.add_attribute(a)
101
+ e['attr'] # => "value"
102
+ a = REXML::Attribute.new('attr', 'VALUE')
103
+ e.add_attribute(a)
104
+ e['attr'] # => "VALUE"
105
+
106
+ ==== Task: Add Multiple Attributes from a Hash
107
+
108
+ Use method
109
+ {Element#add_attributes}[../../../../REXML/Element.html#method-i-add_attributes]
110
+ to add multiple attributes from a hash:
111
+
112
+ e = REXML::Element.new
113
+ h = {'foo' => 0, 'bar' => 1}
114
+ e.add_attributes(h)
115
+ e['foo'] # => "0"
116
+ e['bar'] # => "1"
117
+
118
+ ==== Task: Add Multiple Attributes from an Array
119
+
120
+ Use method
121
+ {Element#add_attributes}[../../../../REXML/Element.html#method-i-add_attributes]
122
+ to add multiple attributes from an array:
123
+
124
+ e = REXML::Element.new
125
+ a = [['foo', 0], ['bar', 1]]
126
+ e.add_attributes(a)
127
+ e['foo'] # => "0"
128
+ e['bar'] # => "1"
129
+
130
+ ==== Task: Retrieve the Value for an Attribute Name
131
+
132
+ Use method
133
+ {Element#[]}[../../../../REXML/Element.html#method-i-5B-5D]
134
+ to retrieve the value for an attribute name:
135
+
136
+ e = REXML::Element.new
137
+ e.add_attribute('attr', 'value') # => "value"
138
+ e['attr'] # => "value"
139
+
140
+ ==== Task: Retrieve the Attribute Value for a Name and Namespace
141
+
142
+ Use method
143
+ {Element#attribute}[../../../../REXML/Element.html#method-i-attribute]
144
+ to retrieve the value for an attribute name:
145
+
146
+ xml_string = "<root xmlns:a='a' a:x='a:x' x='x'/>"
147
+ d = REXML::Document.new(xml_string)
148
+ e = d.root
149
+ e.attribute("x") # => x='x'
150
+ e.attribute("x", "a") # => a:x='a:x'
151
+
152
+ ==== Task: Delete an Attribute
153
+
154
+ Use method
155
+ {Element#delete_attribute}[../../../../REXML/Element.html#method-i-delete_attribute]
156
+ to remove an attribute:
157
+
158
+ e = REXML::Element.new('foo')
159
+ e.add_attribute('bar', 'baz')
160
+ e.delete_attribute('bar')
161
+ e.delete_attribute('bar')
162
+ e['bar'] # => nil
163
+
164
+ ==== Task: Determine Whether the Element Has Attributes
165
+
166
+ Use method
167
+ {Element#has_attributes?}[../../../../REXML/Element.html#method-i-has_attributes-3F]
168
+ to determine whether the element has attributes:
169
+
170
+ e = REXML::Element.new('foo')
171
+ e.has_attributes? # => false
172
+ e.add_attribute('bar', 'baz')
173
+ e.has_attributes? # => true
174
+
175
+ === Children
176
+
177
+ <em>Element Children</em>
178
+
179
+ ==== Task: Create and Add an Element
180
+
181
+ Use method
182
+ {Element#add_element}[../../../../REXML/Element.html#method-i-add_element]
183
+ to create a new element and add it to this element:
184
+
185
+ e0 = REXML::Element.new('foo')
186
+ e0.add_element('bar')
187
+ e0.children # => [<bar/>]
188
+
189
+ ==== Task: Add an Existing Element
190
+
191
+ Use method
192
+ {Element#add_element}[../../../../REXML/Element.html#method-i-add_element]
193
+ to add an element to this element:
194
+
195
+ e0 = REXML::Element.new('foo')
196
+ e1 = REXML::Element.new('bar')
197
+ e0.add_element(e1)
198
+ e0.children # => [<bar/>]
199
+
200
+ ==== Task: Create and Add an Element with Attributes
201
+
202
+ Use method
203
+ {Element#add_element}[../../../../REXML/Element.html#method-i-add_element]
204
+ to create a new element with attributes, and add it to this element:
205
+
206
+ e0 = REXML::Element.new('foo')
207
+ e0.add_element('bar', {'name' => 'value'})
208
+ e0.children # => [<bar name='value'/>]
209
+
210
+ ==== Task: Add an Existing Element with Added Attributes
211
+
212
+ Use method
213
+ {Element#add_element}[../../../../REXML/Element.html#method-i-add_element]
214
+ to add an element to this element:
215
+
216
+ e0 = REXML::Element.new('foo')
217
+ e1 = REXML::Element.new('bar')
218
+ e0.add_element(e1, {'name' => 'value'})
219
+ e0.children # => [<bar name='value'/>]
220
+
221
+ ==== Task: Delete a Specified Element
222
+
223
+ Use method
224
+ {Element#delete_element}[../../../../REXML/Element.html#method-i-delete_element]
225
+ to remove a specified element from this element:
226
+
227
+ e0 = REXML::Element.new('foo')
228
+ e1 = REXML::Element.new('bar')
229
+ e0.add_element(e1)
230
+ e0.children # => [<bar/>]
231
+ e0.delete_element(e1)
232
+ e0.children # => []
233
+
234
+ ==== Task: Delete an Element by Index
235
+
236
+ Use method
237
+ {Element#delete_element}[../../../../REXML/Element.html#method-i-delete_element]
238
+ to remove an element from this element by index:
239
+
240
+ e0 = REXML::Element.new('foo')
241
+ e1 = REXML::Element.new('bar')
242
+ e0.add_element(e1)
243
+ e0.children # => [<bar/>]
244
+ e0.delete_element(1)
245
+ e0.children # => []
246
+
247
+ ==== Task: Delete an Element by XPath
248
+
249
+ Use method
250
+ {Element#delete_element}[../../../../REXML/Element.html#method-i-delete_element]
251
+ to remove an element from this element by XPath:
252
+
253
+ e0 = REXML::Element.new('foo')
254
+ e1 = REXML::Element.new('bar')
255
+ e0.add_element(e1)
256
+ e0.children # => [<bar/>]
257
+ e0.delete_element('//bar/')
258
+ e0.children # => []
259
+
260
+ ==== Task: Determine Whether Element Children
261
+
262
+ Use method
263
+ {Element#has_elements?}[../../../../REXML/Element.html#method-i-has_elements-3F]
264
+ to determine whether the element has element children:
265
+
266
+ e0 = REXML::Element.new('foo')
267
+ e0.has_elements? # => false
268
+ e0.add_element(REXML::Element.new('bar'))
269
+ e0.has_elements? # => true
270
+
271
+ ==== Task: Get Element Descendants by XPath
272
+
273
+ Use method
274
+ {Element#get_elements}[../../../../REXML/Element.html#method-i-get_elements]
275
+ to fetch all element descendant children by XPath:
276
+
277
+ xml_string = <<-EOT
278
+ <root>
279
+ <a level='1'>
280
+ <a level='2'/>
281
+ </a>
282
+ </root>
283
+ EOT
284
+ d = REXML::Document.new(xml_string)
285
+ d.root.get_elements('//a') # => [<a level='1'> ... </>, <a level='2'/>]
286
+
287
+ ==== Task: Get Next Element Sibling
288
+
289
+ Use method
290
+ {Element#next_element}[../../../../REXML/Element.html#method-i-next_element]
291
+ to retrieve the next element sibling:
292
+
293
+ d = REXML::Document.new '<a><b/>text<c/></a>'
294
+ d.root.elements['b'].next_element #-> <c/>
295
+ d.root.elements['c'].next_element #-> nil
296
+
297
+ ==== Task: Get Previous Element Sibling
298
+
299
+ Use method
300
+ {Element#previous_element}[../../../../REXML/Element.html#method-i-previous_element]
301
+ to retrieve the previous element sibling:
302
+
303
+ d = REXML::Document.new '<a><b/>text<c/></a>'
304
+ d.root.elements['c'].previous_element #-> <b/>
305
+ d.root.elements['b'].previous_element #-> nil
306
+
307
+ <em>Text Children</em>
308
+
309
+ ==== Task: Add a Text Node
310
+
311
+ Use method
312
+ {Element#add_text}[../../../../REXML/Element.html#method-i-add_text]
313
+ to add a text node to the element:
314
+
315
+ d = REXML::Document.new('<a>foo<b/>bar</a>')
316
+ e = d.root
317
+ e.add_text(REXML::Text.new('baz'))
318
+ e.to_a # => ["foo", <b/>, "bar", "baz"]
319
+ e.add_text(REXML::Text.new('baz'))
320
+ e.to_a # => ["foo", <b/>, "bar", "baz", "baz"]
321
+
322
+ ==== Task: Replace the First Text Node
323
+
324
+ Use method
325
+ {Element#text=}[../../../../REXML/Element.html#method-i-text-3D]
326
+ to replace the first text node in the element:
327
+
328
+ d = REXML::Document.new('<root><a/>text<b/>more<c/></root>')
329
+ e = d.root
330
+ e.to_a # => [<a/>, "text", <b/>, "more", <c/>]
331
+ e.text = 'oops'
332
+ e.to_a # => [<a/>, "oops", <b/>, "more", <c/>]
333
+
334
+ ==== Task: Remove the First Text Node
335
+
336
+ Use method
337
+ {Element#text=}[../../../../REXML/Element.html#method-i-text-3D]
338
+ to remove the first text node in the element:
339
+
340
+ d = REXML::Document.new('<root><a/>text<b/>more<c/></root>')
341
+ e = d.root
342
+ e.to_a # => [<a/>, "text", <b/>, "more", <c/>]
343
+ e.text = nil
344
+ e.to_a # => [<a/>, <b/>, "more", <c/>]
345
+
346
+ ==== Task: Retrieve the First Text Node
347
+
348
+ Use method
349
+ {Element#get_text}[../../../../REXML/Element.html#method-i-get_text]
350
+ to retrieve the first text node in the element:
351
+
352
+ d = REXML::Document.new('<root><a/>text<b/>more<c/></root>')
353
+ e = d.root
354
+ e.to_a # => [<a/>, "text", <b/>, "more", <c/>]
355
+ e.get_text # => "text"
356
+
357
+ ==== Task: Retrieve a Specific Text Node
358
+
359
+ Use method
360
+ {Element#get_text}[../../../../REXML/Element.html#method-i-get_text]
361
+ to retrieve the first text node in a specified element:
362
+
363
+ d = REXML::Document.new "<root>some text <b>this is bold!</b> more text</root>"
364
+ e = d.root
365
+ e.get_text('//root') # => "some text "
366
+ e.get_text('//b') # => "this is bold!"
367
+
368
+ ==== Task: Determine Whether the Element has Text Nodes
369
+
370
+ Use method
371
+ {Element#has_text?}[../../../../REXML/Element.html#method-i-has_text-3F]
372
+ to determine whether the element has text:
373
+
374
+ e = REXML::Element.new('foo')
375
+ e.has_text? # => false
376
+ e.add_text('bar')
377
+ e.has_text? # => true
378
+
379
+ <em>Other Children</em>
380
+
381
+ ==== Task: Get the Child at a Given Index
382
+
383
+ Use method
384
+ {Element#[]}[../../../../REXML/Element.html#method-i-5B-5D]
385
+ to retrieve the child at a given index:
386
+
387
+ d = REXML::Document.new '><root><a/>text<b/>more<c/></root>'
388
+ e = d.root
389
+ e[0] # => <a/>
390
+ e[1] # => "text"
391
+ e[2] # => <b/>
392
+
393
+ ==== Task: Get All CDATA Children
394
+
395
+ Use method
396
+ {Element#cdatas}[../../../../REXML/Element.html#method-i-cdatas]
397
+ to retrieve all CDATA children:
398
+
399
+ xml_string = <<-EOT
400
+ <root>
401
+ <![CDATA[foo]]>
402
+ <![CDATA[bar]]>
403
+ </root>
404
+ EOT
405
+ d = REXML::Document.new(xml_string)
406
+ d.root.cdatas # => ["foo", "bar"]
407
+
408
+ ==== Task: Get All Comment Children
409
+
410
+ Use method
411
+ {Element#comments}[../../../../REXML/Element.html#method-i-comments]
412
+ to retrieve all comment children:
413
+
414
+ xml_string = <<-EOT
415
+ <root>
416
+ <!--foo-->
417
+ <!--bar-->
418
+ </root>
419
+ EOT
420
+ d = REXML::Document.new(xml_string)
421
+ d.root.comments.map {|comment| comment.to_s } # => ["foo", "bar"]
422
+
423
+ ==== Task: Get All Processing Instruction Children
424
+
425
+ Use method
426
+ {Element#instructions}[../../../../REXML/Element.html#method-i-instructions]
427
+ to retrieve all processing instruction children:
428
+
429
+ xml_string = <<-EOT
430
+ <root>
431
+ <?target0 foo?>
432
+ <?target1 bar?>
433
+ </root>
434
+ EOT
435
+ d = REXML::Document.new(xml_string)
436
+ instructions = d.root.instructions.map {|instruction| instruction.to_s }
437
+ instructions # => ["<?target0 foo?>", "<?target1 bar?>"]
438
+
439
+ ==== Task: Get All Text Children
440
+
441
+ Use method
442
+ {Element#texts}[../../../../REXML/Element.html#method-i-texts]
443
+ to retrieve all text children:
444
+
445
+ xml_string = '<root><a/>text<b/>more<c/></root>'
446
+ d = REXML::Document.new(xml_string)
447
+ d.root.texts # => ["text", "more"]
448
+
449
+ === Namespaces
450
+
451
+ ==== Task: Add a Namespace
452
+
453
+ Use method
454
+ {Element#add_namespace}[../../../../REXML/Element.html#method-i-add_namespace]
455
+ to add a namespace to the element:
456
+
457
+ e = REXML::Element.new('foo')
458
+ e.add_namespace('bar')
459
+ e.namespaces # => {"xmlns"=>"bar"}
460
+
461
+ ==== Task: Delete the Default Namespace
462
+
463
+ Use method
464
+ {Element#delete_namespace}[../../../../REXML/Element.html#method-i-delete_namespace]
465
+ to remove the default namespace from the element:
466
+
467
+ d = REXML::Document.new "<a xmlns:foo='bar' xmlns='twiddle'/>"
468
+ d.to_s # => "<a xmlns:foo='bar' xmlns='twiddle'/>"
469
+ d.root.delete_namespace # => <a xmlns:foo='bar'/>
470
+ d.to_s # => "<a xmlns:foo='bar'/>"
471
+
472
+ ==== Task: Delete a Specific Namespace
473
+
474
+ Use method
475
+ {Element#delete_namespace}[../../../../REXML/Element.html#method-i-delete_namespace]
476
+ to remove a specific namespace from the element:
477
+
478
+ d = REXML::Document.new "<a xmlns:foo='bar' xmlns='twiddle'/>"
479
+ d.to_s # => "<a xmlns:foo='bar' xmlns='twiddle'/>"
480
+ d.root.delete_namespace # => <a xmlns:foo='bar'/>
481
+ d.to_s # => "<a xmlns:foo='bar'/>"
482
+ d.root.delete_namespace('foo')
483
+ d.to_s # => "<a/>"
484
+
485
+ ==== Task: Get a Namespace URI
486
+
487
+ Use method
488
+ {Element#namespace}[../../../../REXML/Element.html#method-i-namespace]
489
+ to retrieve a specific namespace URI for the element:
490
+
491
+ xml_string = <<-EOT
492
+ <root>
493
+ <a xmlns='1' xmlns:y='2'>
494
+ <b/>
495
+ <c xmlns:z='3'/>
496
+ </a>
497
+ </root>
498
+ EOT
499
+ d = REXML::Document.new(xml_string)
500
+ b = d.elements['//b']
501
+ b.namespace # => "1"
502
+ b.namespace('y') # => "2"
503
+
504
+ ==== Task: Retrieve Namespaces
505
+
506
+ Use method
507
+ {Element#namespaces}[../../../../REXML/Element.html#method-i-namespaces]
508
+ to retrieve all namespaces for the element:
509
+
510
+ xml_string = '<a xmlns="foo" xmlns:x="bar" xmlns:y="twee" z="glorp"/>'
511
+ d = REXML::Document.new(xml_string)
512
+ d.root.attributes.namespaces # => {"xmlns"=>"foo", "x"=>"bar", "y"=>"twee"}
513
+
514
+ ==== Task: Retrieve Namespace Prefixes
515
+
516
+ Use method
517
+ {Element#prefixes}[../../../../REXML/Element.html#method-i-prefixes]
518
+ to retrieve all prefixes (namespace names) for the element:
519
+
520
+ xml_string = <<-EOT
521
+ <root>
522
+ <a xmlns:x='1' xmlns:y='2'>
523
+ <b/>
524
+ <c xmlns:z='3'/>
525
+ </a>
526
+ </root>
527
+ EOT
528
+ d = REXML::Document.new(xml_string, {compress_whitespace: :all})
529
+ d.elements['//a'].prefixes # => ["x", "y"]
530
+ d.elements['//b'].prefixes # => ["x", "y"]
531
+ d.elements['//c'].prefixes # => ["x", "y", "z"]
532
+
533
+ === Iteration
534
+
535
+ ==== Task: Iterate Over Elements
536
+
537
+ Use method
538
+ {Element#each_element}[../../../../REXML/Element.html#method-i-each_element]
539
+ to iterate over element children:
540
+
541
+ d = REXML::Document.new '<a><b>b</b><c>b</c><d>d</d><e/></a>'
542
+ d.root.each_element {|e| p e }
543
+
544
+ Output:
545
+
546
+ <b> ... </>
547
+ <c> ... </>
548
+ <d> ... </>
549
+ <e/>
550
+
551
+ ==== Task: Iterate Over Elements Having a Specified Attribute
552
+
553
+ Use method
554
+ {Element#each_element_with_attribute}[../../../../REXML/Element.html#method-i-each_element_with_attribute]
555
+ to iterate over element children that have a specified attribute:
556
+
557
+ d = REXML::Document.new '<a><b id="1"/><c id="2"/><d id="1"/><e/></a>'
558
+ a = d.root
559
+ a.each_element_with_attribute('id') {|e| p e }
560
+
561
+ Output:
562
+
563
+ <b id='1'/>
564
+ <c id='2'/>
565
+ <d id='1'/>
566
+
567
+ ==== Task: Iterate Over Elements Having a Specified Attribute and Value
568
+
569
+ Use method
570
+ {Element#each_element_with_attribute}[../../../../REXML/Element.html#method-i-each_element_with_attribute]
571
+ to iterate over element children that have a specified attribute and value:
572
+
573
+ d = REXML::Document.new '<a><b id="1"/><c id="2"/><d id="1"/><e/></a>'
574
+ a = d.root
575
+ a.each_element_with_attribute('id', '1') {|e| p e }
576
+
577
+ Output:
578
+
579
+ <b id='1'/>
580
+ <d id='1'/>
581
+
582
+ ==== Task: Iterate Over Elements Having Specified Text
583
+
584
+ Use method
585
+ {Element#each_element_with_text}[../../../../REXML/Element.html#method-i-each_element_with_text]
586
+ to iterate over element children that have specified text:
587
+
588
+
589
+ === Context
590
+
591
+ #whitespace
592
+ #ignore_whitespace_nodes
593
+ #raw
594
+
595
+ === Other Getters
596
+
597
+ #document
598
+ #root
599
+ #root_node
600
+ #node_type
601
+ #xpath
602
+ #inspect
@@ -0,0 +1,97 @@
1
+ == Module Node
2
+
3
+ :include: ../tocs/node_toc.rdoc
4
+
5
+ === Siblings
6
+
7
+ ==== Task: Find Previous Sibling
8
+
9
+ Use method
10
+ {Node.previous_sibling_node}[../../../../REXML/Node.html#method-i-previous_sibling]
11
+ to retrieve the previous sibling:
12
+
13
+ d = REXML::Document.new('<root><a/><b/><c/></root>')
14
+ b = d.root[1] # => <b/>
15
+ b.previous_sibling_node # => <a/>
16
+
17
+ ==== Task: Find Next Sibling
18
+
19
+ Use method
20
+ {Node.next_sibling_node}[../../../../REXML/Node.html#method-i-next_sibling]
21
+ to retrieve the next sibling:
22
+
23
+ d = REXML::Document.new('<root><a/><b/><c/></root>')
24
+ b = d.root[1] # => <b/>
25
+ b.next_sibling_node # => <c/>
26
+
27
+ === Position
28
+
29
+ ==== Task: Find Own Index Among Siblings
30
+
31
+ Use method
32
+ {Node.index_in_parent}[../../../../REXML/Node.html#method-i-index_in_parent]
33
+ to retrieve the 1-based index of this node among its siblings:
34
+
35
+ d = REXML::Document.new('<root><a/><b/><c/></root>')
36
+ b = d.root[1] # => <b/>
37
+ b.index_in_parent # => 2
38
+
39
+ === Recursive Traversal
40
+
41
+ ==== Task: Traverse Each Recursively
42
+
43
+ Use method
44
+ {Node.each_recursive}[../../../../REXML/Node.html#method-i-each_recursive]
45
+ to traverse a tree of nodes recursively:
46
+
47
+ xml_string = '<root><a><b><c></c></b><b><c></c></b></a></root>'
48
+ d = REXML::Document.new(xml_string)
49
+ d.root.each_recursive {|node| p node }
50
+
51
+ Output:
52
+
53
+ <a> ... </>
54
+ <b> ... </>
55
+ <c/>
56
+ <b> ... </>
57
+ <c/>
58
+
59
+ === Recursive Search
60
+
61
+ ==== Task: Traverse Each Recursively
62
+
63
+ Use method
64
+ {Node.find_first_recursive}[../../../../REXML/Node.html#method-i-find_first_recursive]
65
+ to search a tree of nodes recursively:
66
+
67
+ xml_string = '<root><a><b><c></c></b><b><c></c></b></a></root>'
68
+ d = REXML::Document.new(xml_string)
69
+ d.root.find_first_recursive {|node| node.name == 'c' } # => <c/>
70
+
71
+ === Representation
72
+
73
+ ==== Task: Represent a String
74
+
75
+ Use method {Node.to_s}[../../../../REXML/Node.html#method-i-to_s]
76
+ to represent the node as a string:
77
+
78
+ xml_string = '<root><a><b><c></c></b><b><c></c></b></a></root>'
79
+ d = REXML::Document.new(xml_string)
80
+ d.root.to_s # => "<root><a><b><c/></b><b><c/></b></a></root>"
81
+
82
+ === Parent?
83
+
84
+ ==== Task: Determine Whether the Node is a Parent
85
+
86
+ Use method {Node.parent?}[../../../../REXML/Node.html#method-i-parent-3F]
87
+ to determine whether the node is a parent;
88
+ class Text derives from Node:
89
+
90
+ d = REXML::Document.new('<root><a/>text<b/>more<c/></root>')
91
+ t = d.root[1] # => "text"
92
+ t.parent? # => false
93
+
94
+ Class Parent also derives from Node, but overrides this method:
95
+
96
+ p = REXML::Parent.new
97
+ p.parent? # => true