Represents an XML DOCTYPE declaration; that is, the contents of <!DOCTYPE … >. DOCTYPES can be used to declare the DTD of a document, as well as being used to declare entities used in the document.

Methods
A
C
E
N
P
S
W
Included Modules
Constants
START = "<!DOCTYPE"
 
STOP = ">"
 
SYSTEM = "SYSTEM"
 
PUBLIC = "PUBLIC"
 
DEFAULT_ENTITIES = { 'gt'=>EntityConst::GT, 'lt'=>EntityConst::LT, 'quot'=>EntityConst::QUOT, "apos"=>EntityConst::APOS }
 
Attributes
[R] entities

name is the name of the doctype #external_id is the referenced DTD, if given

[R] external_id

name is the name of the doctype #external_id is the referenced DTD, if given

[R] name

name is the name of the doctype #external_id is the referenced DTD, if given

[R] namespaces

name is the name of the doctype #external_id is the referenced DTD, if given

Class Public methods
new( first, parent=nil )

Constructor

dt = DocType.new( 'foo', '-//I/Hate/External/IDs' )
# <!DOCTYPE foo '-//I/Hate/External/IDs'>
dt = DocType.new( doctype_to_clone )
# Incomplete.  Shallow clone of doctype

Note that the constructor:

Doctype.new( Source.new( "<!DOCTYPE foo 'bar'>" ) )

is deprecated. Do not use it. It will probably disappear.

# File lib/rexml/doctype.rb, line 41
def initialize( first, parent=nil )
  @entities = DEFAULT_ENTITIES
  @long_name = @uri = nil
  if first.kind_of? String
    super()
    @name = first
    @external_id = parent
  elsif first.kind_of? DocType
    super( parent )
    @name = first.name
    @external_id = first.external_id
  elsif first.kind_of? Array
    super( parent )
    @name = first[0]
    @external_id = first[1]
    @long_name = first[2]
    @uri = first[3]
  elsif first.kind_of? Source
    super( parent )
    parser = Parsers::BaseParser.new( first )
    event = parser.pull
    if event[0] == :start_doctype
      @name, @external_id, @long_name, @uri, = event[1..-1]
    end
  else
    super()
  end
end
Instance Public methods
add(child)
# File lib/rexml/doctype.rb, line 136
def add child
  super(child)
  @entities = DEFAULT_ENTITIES.clone if @entities == DEFAULT_ENTITIES
  @entities[ child.name ] = child if child.kind_of? Entity
end
attribute_of(element, attribute)
# File lib/rexml/doctype.rb, line 84
def attribute_of element, attribute
  att_decl = find do |child|
    child.kind_of? AttlistDecl and
    child.element_name == element and
    child.include? attribute
  end
  return nil unless att_decl
  att_decl[attribute]
end
attributes_of(element)
# File lib/rexml/doctype.rb, line 74
def attributes_of element
  rv = []
  each do |child|
    child.each do |key,val|
      rv << Attribute.new(key,val)
    end if child.kind_of? AttlistDecl and child.element_name == element
  end
  rv
end
clone()
# File lib/rexml/doctype.rb, line 94
def clone
  DocType.new self
end
context()
# File lib/rexml/doctype.rb, line 128
def context
  @parent.context
end
entity( name )
# File lib/rexml/doctype.rb, line 132
def entity( name )
  @entities[name].unnormalized if @entities[name]
end
node_type()
# File lib/rexml/doctype.rb, line 70
def node_type
  :doctype
end
notation(name)

Retrieves a named notation. Only notations declared in the internal DTD subset can be retrieved.

Method contributed by Henrik Martensson

# File lib/rexml/doctype.rb, line 180
def notation(name)
  notations.find { |notation_decl|
    notation_decl.name == name
  }
end
notations()

This method returns a list of notations that have been declared in the internal DTD subset. Notations in the external DTD subset are not listed.

Method contributed by Henrik Martensson

# File lib/rexml/doctype.rb, line 172
def notations
  children().select {|node| node.kind_of?(REXML::NotationDecl)}
end
public()

This method retrieves the public identifier identifying the document's DTD.

Method contributed by Henrik Martensson

# File lib/rexml/doctype.rb, line 146
def public
  case @external_id
  when "SYSTEM"
    nil
  when "PUBLIC"
    strip_quotes(@long_name)
  end
end
system()

This method retrieves the system identifier identifying the document's DTD

Method contributed by Henrik Martensson

# File lib/rexml/doctype.rb, line 158
def system
  case @external_id
  when "SYSTEM"
    strip_quotes(@long_name)
  when "PUBLIC"
    @uri.kind_of?(String) ? strip_quotes(@uri) : nil
  end
end
write( output, indent=0, transitive=false, ie_hack=false )
output

Where to write the string

indent

An integer. If -1, no indentation will be used; otherwise, the indentation will be this number of spaces, and children will be indented an additional amount.

transitive

Ignored

ie_hack

Ignored

# File lib/rexml/doctype.rb, line 108
def write( output, indent=0, transitive=false, ie_hack=false )
  f = REXML::Formatters::Default.new
  indent( output, indent )
  output << START
  output << ' '
  output << @name
  output << " #@external_id" if @external_id
  output << " #{@long_name.inspect}" if @long_name
  output << " #{@uri.inspect}" if @uri
  unless @children.empty?
    output << ' ['
    @children.each { |child|
      output << "\n"
      f.write( child, output )
    }
    output << "\n]"
  end
  output << STOP
end