Class: Rexle

Inherits:
Object
  • Object
show all
Includes:
XMLhelper
Defined in:
lib/rexle.rb

Defined Under Namespace

Classes: CData, Comment, Element, Elements, Recordset

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from XMLhelper

#doc_pretty_print, #doc_print, #inspect, #pretty_print, #processing_instructions, #scan_print, #scan_to_a

Constructor Details

#initialize(x = nil) ⇒ Rexle

Returns a new instance of Rexle.



230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
# File 'lib/rexle.rb', line 230

def initialize(x=nil)

  super()

  @instructions = [["xml", "version='1.0' encoding='UTF-8'"]] 
  @doctype = :xml

  # what type of input is it? Is it a string, array
  if x then
    procs = {
      String: proc {|x| parse_string(x)},
      Array: proc {|x| x},
      RexleParser: ->(x){ parse_rexle(x)}
    }
    
    doc_node = ['doc',Attributes.new]

    @a = procs[x.class.to_s.to_sym].call(x)
    
    @doc = scan_element(*(doc_node << @a))

    # fetch the namespaces
    @prefixes = []

    if @doc.root.attributes then

      xmlns = @doc.root.attributes.select {|k,v| k[/^xmlns:/]}
      @prefixes = xmlns.keys.map{|x| x[/\w+$/]}
    end
    
  end

end

Instance Attribute Details

#doctypeObject (readonly)

Returns the value of attribute doctype.



227
228
229
# File 'lib/rexle.rb', line 227

def doctype
  @doctype
end

#instructionsObject

Returns the value of attribute instructions.



228
229
230
# File 'lib/rexle.rb', line 228

def instructions
  @instructions
end

#prefixesObject (readonly)

Returns the value of attribute prefixes.



227
228
229
# File 'lib/rexle.rb', line 227

def prefixes
  @prefixes
end

Instance Method Details

#add_attribute(x) ⇒ Object



1378
# File 'lib/rexle.rb', line 1378

def add_attribute(x) @doc.attribute(x) end

#add_element(element) ⇒ Object Also known as: add



1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
# File 'lib/rexle.rb', line 1382

def add_element(element)  

  if @doc then     
    raise 'attempted adding second root element to document' if @doc.root
    @doc.root.add_element(element) 
  else
    doc_node = ['doc', Attributes.new, element.to_a]  
    @doc = scan_element(*doc_node)      
  end
  element
end

#add_text(s) ⇒ Object



1394
# File 'lib/rexle.rb', line 1394

def add_text(s) end

#at_css(selector) ⇒ Object



268
269
270
# File 'lib/rexle.rb', line 268

def at_css(selector)
  @doc.root.element RexleCSS.new(selector).to_xpath
end

#attribute(key) ⇒ Object



1379
# File 'lib/rexle.rb', line 1379

def attribute(key) @doc.attribute(key) end

#attributesObject



1380
# File 'lib/rexle.rb', line 1380

def attributes() @doc.attributes end

#cloneObject



264
265
266
# File 'lib/rexle.rb', line 264

def clone()
  Rexle.new self.to_a
end

#content(options = {}) ⇒ Object



1444
1445
1446
# File 'lib/rexle.rb', line 1444

def content(options={})
  CGI.unescapeHTML(xml(options))
end

#css(selector) ⇒ Object



272
273
274
275
276
277
278
279
280
281
# File 'lib/rexle.rb', line 272

def css(selector)
  
  a = selector.split(',').flat_map do |x| 
    @doc.root.xpath RexleCSS.new(x).to_xpath
  end
  
  a.shift if self.kind_of? Rexle
  
  return a
end

#delete(xpath) ⇒ Object Also known as: remove



1398
1399
1400
1401
1402
# File 'lib/rexle.rb', line 1398

def delete(xpath)

  @doc.xpath(xpath).each {|e| e.delete }

end

#element(xpath) ⇒ Object



1406
# File 'lib/rexle.rb', line 1406

def element(xpath) self.xpath(xpath).first end

#elements(s = nil) ⇒ Object



1407
# File 'lib/rexle.rb', line 1407

def elements(s=nil) @doc.elements(s) end

#nameObject



1408
# File 'lib/rexle.rb', line 1408

def name() @doc.root.name end

#parse(x = nil) ⇒ Object



1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
# File 'lib/rexle.rb', line 1357

def parse(x=nil)
  
  a = []
  
  if x then
    procs = {
      String: proc {|x| parse_string(x)},
      Array: proc {|x| x}
    }
    a = procs[x.class.to_s.to_sym].call(x)
  else    
    a = yield
  end
  
  doc_node = ['doc',Attributes.new]
  @a = procs[x.class.to_s.to_sym].call(x)
  @doc = scan_element(*(doc_node << @a))
  
  self
end

#rootObject



1417
1418
1419
# File 'lib/rexle.rb', line 1417

def root() 
  @doc.elements.first 
end

#text(xpath) ⇒ Object



1416
# File 'lib/rexle.rb', line 1416

def text(xpath) @doc.text(xpath) end

#to_aObject



1409
# File 'lib/rexle.rb', line 1409

def to_a() @a end

#to_s(options = {}) ⇒ Object



1411
1412
1413
1414
# File 'lib/rexle.rb', line 1411

def to_s(options={}) 
  return '<UNDEFINED/>' unless @doc
  self.xml options 
end

#write(f) ⇒ Object



1421
1422
1423
# File 'lib/rexle.rb', line 1421

def write(f) 
  f.write xml 
end

#xml(options = {}) ⇒ Object



1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
# File 'lib/rexle.rb', line 1425

def xml(options={})

  return '' unless @doc
  o = {pretty: false, declaration: true}.merge(options)
  msg = o[:pretty] == false ? :doc_print : :doc_pretty_print

  r = ''

  if o[:declaration] == true then

    unless @instructions.assoc 'xml' then
      @instructions.unshift ["xml","version='1.0' encoding='UTF-8'"]
    end
  end

  r << method(msg).call(self.root.children, o[:declaration]).strip
  r
end

#xpath(path, &blk) ⇒ Object



283
284
285
# File 'lib/rexle.rb', line 283

def xpath(path,  &blk)
  @doc.xpath(path,  &blk)
end