class REXML::DocType
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.
Constants
- DEFAULT_ENTITIES
- PUBLIC
- START
- STOP
- SYSTEM
Attributes
name is the name of the doctype external_id
is the referenced DTD
, if given
name is the name of the doctype external_id
is the referenced DTD
, if given
name is the name of the doctype external_id
is the referenced DTD
, if given
name is the name of the doctype external_id
is the referenced DTD
, if given
Public Class Methods
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 80 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 @long_name = first.instance_variable_get(:@long_name) @uri = first.instance_variable_get(:@uri) 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
Public Instance Methods
# File lib/rexml/doctype.rb, line 185 def add child super(child) @entities = DEFAULT_ENTITIES.clone if @entities == DEFAULT_ENTITIES @entities[ child.name ] = child if child.kind_of? Entity end
# File lib/rexml/doctype.rb, line 125 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
# File lib/rexml/doctype.rb, line 115 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
# File lib/rexml/doctype.rb, line 135 def clone DocType.new self end
# File lib/rexml/doctype.rb, line 173 def context if @parent @parent.context else nil end end
# File lib/rexml/doctype.rb, line 181 def entity( name ) @entities[name].unnormalized if @entities[name] end
# File lib/rexml/doctype.rb, line 111 def node_type :doctype end
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 229 def notation(name) notations.find { |notation_decl| notation_decl.name == name } end
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 221 def notations children().select {|node| node.kind_of?(REXML::NotationDecl)} end
This method retrieves the public identifier identifying the document’s DTD
.
Method contributed by Henrik Martensson
# File lib/rexml/doctype.rb, line 195 def public case @external_id when "SYSTEM" nil when "PUBLIC" @long_name end end
This method retrieves the system identifier identifying the document’s DTD
Method contributed by Henrik Martensson
# File lib/rexml/doctype.rb, line 207 def system case @external_id when "SYSTEM" @long_name when "PUBLIC" @uri.kind_of?(String) ? @uri : nil end end
- 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 149 def write( output, indent=0, transitive=false, ie_hack=false ) f = REXML::Formatters::Default.new indent( output, indent ) output << START output << ' ' output << @name if @external_id reference_writer = ReferenceWriter.new(@external_id, @long_name, @uri, context) reference_writer.write(output) end unless @children.empty? output << ' [' @children.each { |child| output << "\n" f.write( child, output ) } output << "\n]" end output << STOP end