<?xml version="1.0" encoding="us-ascii"?>
<!-- $Id: xml-source.xml,v 1.5 2004/02/04 22:41:13 plehegar Exp $ --><!DOCTYPE spec PUBLIC "-//W3C//DTD Specification V2.2-Based DOM//EN" "http://www.w3.org/2002/08/xmlspec-v22-dom.dtd">
<spec w3c-doctype="pr" role="public">
  <!--
  *************************************************************************
  * FRONT MATTER                                                          *
  *************************************************************************
  -->
<!-- 
  ****************************************************** 
  | filenames to be used for each section              |
  ******************************************************
-->
<?command-options --map Copyright-Notice copyright-notice
--map Introduction     introduction
--map TOC expanded-toc
--map Core core
--map Events events
--map idl idl-definitions
--map ecma-binding ecma-script-binding
--map java-binding java-binding
--map Index def-index
--map Objects object-index
--map References references
--map Errors errors
--map Level-3-AS abstract-schemas
--map Load-Save load-save
--map XPath xpath
--map KeySet keyset
?>

<?command-options --map -IndexFile-      def-index
--map -OjbectIndexFile-      object-index
--strip-references
--strip-glossary
?>

<?command-options --map-type ECMAScript void void
--map-type ECMAScript "unsigned short" Number
--map-type ECMAScript "unsigned int" Number
--map-type ECMAScript "unsigned long" Number
--map-type ECMAScript short Number
--map-type ECMAScript long Number
--map-type ECMAScript float Number
--map-type ECMAScript double Number
--map-type ECMAScript boolean Boolean
--map-type ECMAScript Object Object
--map-type ECMAScript DOMString String
--map-type ECMAScript DOMTimeStamp Date
--map-type ECMAScript DOMObject Object
--map-type ECMAScript DOMUserData "any type"
--map-type ECMAScript LSInputStream Object
--map-type ECMAScript LSOutputStream Object
--map-type ECMAScript LSReader "this is an error and shouldn't be used."
--map-type ECMAScript LSWriter "this is an error and shouldn't be used."
--map-type ECMAScript DOMSystemException Object

--map-type Java void void
--map-type Java Object Object
--map-type Java DOMString String
--map-type Java "unsigned short" short
--map-type Java "unsigned int" int
--map-type Java "unsigned long" int
--map-type Java long int
--map-type Java short short
--map-type Java float float
--map-type Java double double
--map-type Java boolean boolean
--map-type Java DOMTimeStamp long
--map-type Java DOMObject Object
--map-type Java DOMUserData Object
--map-type Java LSInputStream java.io.InputStream
--map-type Java LSOutputStream java.io.OutputStream
--map-type Java LSReader java.io.Reader
--map-type Java LSWriter java.io.Writer
--map-type Java DOMSystemException Exception
?>

<header> 
<title>Document Object Model (DOM) Level 3 Core Specification</title>
<version>1.0</version> <w3c-designation>PR-DOM-Level-3-Core-20040205
</w3c-designation> <w3c-doctype>W3C Proposed Recommendation</w3c-doctype> <pubdate> 
<day>05</day> <month>February</month> <year>2004</year> 
</pubdate> 
    <publoc>
      <loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/TR/2004/PR-DOM-Level-3-Core-20040205" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">http://www.w3.org/TR/2004/PR-DOM-Level-3-Core-20040205</loc>
    </publoc>
    <altlocs>
      <loc xmlns:xlink="http://www.w3.org/1999/xlink" role="html" href="http://www.w3.org/TR/2004/PR-DOM-Level-3-Core-20040205/xml-source.xml" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">XML file</loc>
      <loc xmlns:xlink="http://www.w3.org/1999/xlink" role="plain" href="http://www.w3.org/TR/2004/PR-DOM-Level-3-Core-20040205/DOM3-Core.txt" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">plain text</loc>
      <loc xmlns:xlink="http://www.w3.org/1999/xlink" role="postscript" href="http://www.w3.org/TR/2004/PR-DOM-Level-3-Core-20040205/DOM3-Core.ps" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">PostScript file</loc>
      <loc xmlns:xlink="http://www.w3.org/1999/xlink" role="pdf" href="http://www.w3.org/TR/2004/PR-DOM-Level-3-Core-20040205/DOM3-Core.pdf" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">PDF file</loc>
      <loc xmlns:xlink="http://www.w3.org/1999/xlink" role="html" href="http://www.w3.org/TR/2004/PR-DOM-Level-3-Core-20040205/DOM3-Core.html" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">single HTML file</loc>
      <loc xmlns:xlink="http://www.w3.org/1999/xlink" role="zip" href="http://www.w3.org/TR/2004/PR-DOM-Level-3-Core-20040205/DOM3-Core.zip" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">ZIP file</loc>
    </altlocs>
    <latestloc>
      <loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/TR/DOM-Level-3-Core" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">http://www.w3.org/TR/DOM-Level-3-Core</loc>
    </latestloc>
    <prevlocs>
      <loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/TR/2003/CR-DOM-Level-3-Core-20031107" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">http://www.w3.org/TR/2003/CR-DOM-Level-3-Core-20031107</loc>
    </prevlocs> 
    <authlist> 
    <author role="editor">
      <name>Arnaud Le Hors</name>
      <affiliation>IBM</affiliation>
    </author>
      <author role="editor">
	<name>Philippe Le H&#233;garet</name> 
	<affiliation>W3C</affiliation>
      </author> 
    <author role="editor">
      <name>Lauren Wood</name>
      <affiliation>SoftQuad, Inc. (WG Chair emerita, for DOM Level 1 and 2)</affiliation>
    </author>
    <author role="editor">
      <name>Gavin Nicol</name>
      <affiliation>Inso EPS (for DOM Level 1)</affiliation>
    </author>
      <author role="editor">
	<name>Jonathan Robie</name>
	<affiliation>Texcel Research and Software AG (for DOM Level 1
	  and 2)</affiliation>
      </author>
    <author role="editor">
      <name>Mike Champion</name>
      <affiliation>Arbortext and Software AG (for DOM Level 1 and 2)</affiliation>
    </author>
    <author role="editor">
      <name>Steve Byrne</name>
      <affiliation>JavaSoft (for DOM Level 1 until November 19,
        1997)</affiliation>
    </author>
</authlist>
    <!--
    ******************************************************
    * DOCUMENT ABSTRACT                                  *
    ******************************************************
    -->
    <abstract id="id-abstract"> 

      <p>
	This specification defines the Document Object Model Core Level
	3, a platform- and language-neutral interface that allows
	programs and scripts to dynamically access and update the
	content, structure and style of documents.  The Document Object
	Model Core Level 3 builds on the Document Object Model Core
	Level 2 <bibref role="informative" ref="DOM2Core"/>.
      </p>
      <p>
	This version enhances DOM Level 2 Core by completing the mapping
	between DOM and the XML Information Set <bibref ref="InfoSet"/>,
	including the support for XML Base <bibref ref="XMLBase"/>,
	adding the ability to attach user information to DOM Nodes or to
	bootstrap a DOM implementation, providing mechanisms to resolve
	namespace prefixes or to manipulate "ID" attributes, giving to type
	information, etc.
      </p>

    </abstract>

    <status id="Level-3-status">
      <p>
	<emph>This section describes the status of this document at the
	time of its publication. Other documents may supersede this
	document. A list of current W3C publications and the latest
	revision of this technical report can be found in the <loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/TR/" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">W3C technical reports index</loc>
	at http://www.w3.org/TR/.</emph>
      </p>
      <p>
	This document contains the Document Object Model Level 3 Core
	specification and is a <loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/2003/06/Process-20030618/tr.html#RecsPR" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">Proposed
	Recommendation</loc>. It has been produced as part of the <loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/DOM/Activity.html" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">W3C DOM
	Activity</loc>. The authors of this document are the DOM Working
	Group members. For more information about DOM, readers can also
	refer to <loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/DOM/faq.html" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">DOM
	FAQ</loc> and <loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/DOM/Test/" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">DOM
	Conformance Test Suites</loc>.
      </p>
      <p>
	It is based on the feedback received during the <loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/2003/12/22-dom-core-issues/issues.html" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">Candidate
	Recommendation</loc> period.  An <loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/2003/10/DOM-Level-3-Core-implementations.html" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">implementation
	report</loc> is available.
      </p>
      <p>
	W3C Advisory Committee Representatives are now invited to submit
	their formal review via Web form, as described in the Call for
	Review. Additional comments may be sent to a Team-only list,
	<loc xmlns:xlink="http://www.w3.org/1999/xlink" href="mailto:dom-review@w3.org" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">dom-review@w3.org</loc>. The
	public is invited to send comments to the public mailing list
	<loc xmlns:xlink="http://www.w3.org/1999/xlink" href="mailto:www-dom@w3.org" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">www-dom@w3.org</loc> (<loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://lists.w3.org/Archives/Public/www-dom/" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">public archive</loc>). The review period
	ends on 5 March 2004.
      </p>
      <p>
	Publication as a Proposed Recommendation does not imply
	endorsement by the W3C Membership. This is a draft document and
	may be updated, replaced or obsoleted by other documents at any
	time. It is inappropriate to cite this document as other than
	work in progress.
      </p>
      <p>
        Patent disclosures relevant to this specification may be found
        on the Working Group's <loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/2002/08/02-DOM-Disclosures.html" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">patent
        disclosure page</loc>.
      </p>
    </status>

<sourcedesc>
<p>Created in electronic form.</p>
</sourcedesc>
<langusage>
<language id="en">English</language>
</langusage>
<revisiondesc>
<p>$Revision: 1.5 $</p>
</revisiondesc>
<?GENERATE-TOC?>
</header>
<front>
  
<!-- $Id: xml-source.xml,v 1.5 2004/02/04 22:41:13 plehegar Exp $ -->
<div1 id="TOC">
  <head>Expanded Table of Contents</head>
  <?GENERATE-EXPANDED-TOC?>	
</div1>

  
<!-- $Id: xml-source.xml,v 1.5 2004/02/04 22:41:13 plehegar Exp $ -->
<!--
 *************************************************************************
 * BEGINNING OF COPYRIGHT NOTICE                                         *
 *************************************************************************
-->
<div1 id="Copyright-Notice">
  <head>W3C Copyright Notices and Licenses</head>

  <p role="important">
    Copyright &#169; 2004 <loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">World
    Wide Web Consortium</loc>, (<loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.csail.mit.edu/" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">Massachusetts Institute of
    Technology</loc>, <loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.ercim.org/" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">European
    Research Consortium for Informatics and Mathematics</loc>, <loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.keio.ac.jp/" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">Keio University</loc>). All Rights
    Reserved.
  </p>
  <p>
    This document is published under the <specref ref="Copyright-notice-document"/>. The bindings within this document
    are published under the <specref ref="Copyright-notice-software"/>.
    The software license requires "Notice of any changes or
    modifications to the W3C files, including the date changes were
    made." Consequently, modified versions of the DOM bindings must
    document that they do not conform to the W3C standard; in the case
    of the IDL definitions, the pragma prefix can no longer be
    'w3c.org'; in the case of the Java language binding, the package
    names can no longer be in the 'org.w3c' package.
  </p>
  <div2 id="Copyright-notice-document">
    <head>W3C<sup>&#174;</sup> Document Copyright Notice and License</head>
    <note>
      <p>
	This section is a copy of the W3C<sup>&#174;</sup> Document
	Notice and License and could be found at <loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/Consortium/Legal/2002/copyright-documents-20021231" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">http://www.w3.org/Consortium/Legal/2002/copyright-documents-20021231</loc>.
      </p>
    </note>
    <p role="important">
      Copyright &#169; 2004 <loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">World Wide Web Consortium</loc>, (<loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.lcs.mit.edu/" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">Massachusetts Institute of
      Technology</loc>, <loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.ercim.org/" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">European
      Research Consortium for Informatics and Mathematics</loc>, <loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.keio.ac.jp/" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">Keio University</loc>). All Rights
      Reserved.
    </p>
    <p role="important">      
      http://www.w3.org/Consortium/Legal/2002/copyright-documents-20021231
    </p>
    <p>
      Public documents on the W3C site are provided by the copyright
      holders under the following license. By using and/or copying this
      document, or the W3C document from which this statement is linked,
      you (the licensee) agree that you have read, understood, and will
      comply with the following terms and conditions:
    </p>
    <p>
      Permission to copy, and distribute the contents of this document,
      or the W3C document from which this statement is linked, in any
      medium for any purpose and without fee or royalty is hereby
      granted, provided that you include the following on
      <emph>ALL</emph> copies of the document, or portions thereof, that
      you use:
    </p>
    <olist>
      <item>
	<p>
	  A link or URL to the original W3C document.
	</p>
      </item>
      <item>
	<p>
	  The pre-existing copyright notice of the original author, or
	  if it doesn't exist, a notice (hypertext is preferred, but a
	  textual representation is permitted) of the form:
	  "Copyright &#169; [$date-of-document] <loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">World Wide Web Consortium</loc>,
	  (<loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.lcs.mit.edu/" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">Massachusetts Institute
	  of Technology</loc>, <loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.ercim.org/" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">European Research Consortium for
	  Informatics and Mathematics</loc>, <loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.keio.ac.jp/" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">Keio University</loc>). All
	  Rights Reserved.  <loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/Consortium/Legal/2002/copyright-documents-20021231" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">http://www.w3.org/Consortium/Legal/2002/copyright-documents-20021231</loc>"
	</p>
      </item>
      <item>
	<p>
	  <emph>If it exists</emph>, the STATUS of the W3C document.
	</p>
      </item>
    </olist>
    <p>
      When space permits, inclusion of the full text of this <emph role="important">NOTICE</emph> should be provided. We request that
      authorship attribution be provided in any software, documents, or other
      items or products that you create pursuant to the implementation of the
      contents of this document, or any portion thereof.
    </p>
    <p>
      No right to create modifications or derivatives of W3C documents is
      granted pursuant to this license. However, if additional requirements
      (documented in the <loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/Consortium/Legal/IPR-FAQ" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">Copyright
      FAQ</loc>) are satisfied, the right to create modifications or
      derivatives is sometimes granted by the W3C to individuals complying with
      those requirements.
    </p>
    <p>
      THIS DOCUMENT IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE
      NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, BUT NOT
      LIMITED TO, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
      PURPOSE, NON-INFRINGEMENT, OR TITLE; THAT THE CONTENTS OF THE DOCUMENT
      ARE SUITABLE FOR ANY PURPOSE; NOR THAT THE IMPLEMENTATION OF SUCH
      CONTENTS WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS,
      TRADEMARKS OR OTHER RIGHTS.
    </p>
    <p>
      COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR
      CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE DOCUMENT OR THE
      PERFORMANCE OR IMPLEMENTATION OF THE CONTENTS THEREOF.
    </p>
    <p>
      The name and trademarks of copyright holders may NOT be used in
      advertising or publicity pertaining to this document or its contents
      without specific, written prior permission. Title to copyright in this
      document will at all times remain with copyright holders.
    </p>
  </div2>
  <div2 id="Copyright-notice-software">
    <head>W3C<sup>&#174;</sup> Software Copyright Notice and License</head>
    <note>
      <p>
	This section is a copy of the W3C<sup>&#174;</sup> Software
	Copyright Notice and License and could be found at <loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231</loc>
      </p>
    </note>
    <p role="important">
      Copyright &#169; 2004 <loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">World Wide Web Consortium</loc>, (<loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.lcs.mit.edu/" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">Massachusetts Institute of
      Technology</loc>, <loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.ercim.org/" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">European
      Research Consortium for Informatics and Mathematics</loc>, <loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.keio.ac.jp/" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">Keio University</loc>). All Rights
      Reserved.
    </p>
    <p role="important">      
      http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231
    </p>
    <p>
      This work (and included software, documentation such as READMEs,
      or other related items) is being provided by the copyright holders
      under the following license. By obtaining, using and/or copying
      this work, you (the licensee) agree that you have read,
      understood, and will comply with the following terms and
      conditions.
    </p>
    <p>
      Permission to copy, modify, and distribute this software and its
      documentation, with or without modification, for any purpose and
      without fee or royalty is hereby granted, provided that you
      include the following on ALL copies of the software and
      documentation or portions thereof, including modifications:
    </p>
    <olist>
      <item>
	<p>The full text of this NOTICE in a location viewable to users of the
	redistributed or derivative work.</p>
      </item>
      <item>
	<p>
	  Any pre-existing intellectual property disclaimers, notices,
	  or terms and conditions. If none exist, the <specref ref="Copyright-short-notice"/> should be included (hypertext
	  is preferred, text is permitted) within the body of any
	  redistributed or derivative code.
	</p>
      </item>
      <item>
	<p>
	  Notice of any changes or modifications to the files, including
	  the date changes were made. (We recommend you provide URIs to
	  the location from which the code is derived.)
	</p>
      </item>
    </olist>
    <p>
      THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT
      HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED,
      INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS
      FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE OR
      DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS,
      TRADEMARKS OR OTHER RIGHTS.
    </p>
    <p>
      COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR
      CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR
      DOCUMENTATION.
    </p>
    <p>
      The name and trademarks of copyright holders may NOT be used in
      advertising or publicity pertaining to the software without specific,
      written prior permission. Title to copyright in this software and any
      associated documentation will at all times remain with copyright holders.
    </p>
  </div2>
  <div2 id="Copyright-short-notice">
    <head>W3C<sup>&#174;</sup> Short Software Notice</head>

    <note>
      <p>
	This section is a copy of the W3C<sup>&#174;</sup> Short Software
	Notice and could be found at <loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/Consortium/Legal/2002/copyright-software-short-notice-20021231" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">http://www.w3.org/Consortium/Legal/2002/copyright-software-short-notice-20021231</loc>
      </p>
    </note>
    <p role="important">
      Copyright &#169; 2004 <loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">World
      Wide Web Consortium</loc>, (<loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.lcs.mit.edu/" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">Massachusetts Institute of
      Technology</loc>, <loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.ercim.org/" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">European
      Research Consortium for Informatics and Mathematics</loc>, <loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.keio.ac.jp/" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">Keio University</loc>). All Rights
      Reserved.
    </p>
    <p>
      Copyright &#169; [$date-of-software] <loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">World Wide Web Consortium</loc>, (<loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.lcs.mit.edu/" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">Massachusetts Institute of
      Technology</loc>, <loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.ercim.org/" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">European
      Research Consortium for Informatics and Mathematics</loc>, <loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.keio.ac.jp/" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">Keio University</loc>). All Rights
      Reserved. This work is distributed under the W3C<sup>&#174;</sup>
      Software License [1] in the hope that it will be useful, but
      WITHOUT ANY WARRANTY; without even the implied warranty of
      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    </p>
    <p>
      [1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231
    </p>
  </div2>
</div1>
<!--
 *************************************************************************
 * END OF COPYRIGHT NOTICE                                               *
 *************************************************************************
-->

  
<!-- $Id: xml-source.xml,v 1.5 2004/02/04 22:41:13 plehegar Exp $ -->
<!--
 *************************************************************************
 * BEGINNING OF DOM INTRODUCTION                                         * 
 *************************************************************************
-->
<div1 id="Introduction">
  <head>What is the Document Object Model?</head>

  <orglist role="editors">
    <member>
      <name>Philippe Le H&#233;garet</name>
      <affiliation>W3C</affiliation>
    </member>
    <member>
      <name>Lauren Wood</name>
      <affiliation>SoftQuad Software Inc. (for DOM Level 2)</affiliation>
    </member>
    <member>
      <name>Jonathan Robie</name>
      <affiliation>Texcel (for DOM Level 1)</affiliation>
    </member>
  </orglist>

  <div2 id="ID-E7C3082">
    <head>Introduction</head>
    <p>The Document Object Model (DOM) is an application programming interface 
      (<termref def="dt-API">API</termref>) for valid <termref def="dt-HTML">HTML</termref> and
      well-formed <termref def="dt-XML">XML</termref> documents. It defines the logical structure of documents and
      the way a document is accessed and manipulated. In the DOM specification,
      the term "document" is used in the broad sense - increasingly, XML is being used as a
      way of representing many different kinds of information that may
      be stored in diverse systems, and much of this would traditionally
      be seen as data rather than as documents. Nevertheless, XML presents
      this data as documents, and the DOM may be used to manage this data.</p>

    <p>With the Document
      Object Model, programmers can build documents, navigate
      their structure, and add, modify, or delete elements and content.
      Anything found in an HTML or XML document can be accessed,
      changed, deleted, or added using the Document Object Model,
      with a few exceptions - in particular, the DOM <termref def="dt-interface">interfaces</termref> for
      the XML internal and external subsets have not yet been specified.</p>
    <p>As a W3C specification, one important objective for the Document
      Object Model is to provide a standard programming interface that
      can be used in a wide variety of environments and <termref def="dt-application">applications</termref>.
      The DOM is designed to be used with any programming
      language. In order to provide a precise, language-independent
      specification of the DOM interfaces, we have chosen to define
      the specifications in Object Management Group (OMG) IDL <bibref role="normative" ref="OMGIDL"/>, as defined in the CORBA 2.3.1 specification <bibref role="informative" ref="CORBA"/>. In addition to the OMG IDL specification, we provide
      <termref def="dt-lang-binding">language bindings</termref> for Java <bibref role="normative" ref="Java"/> and ECMAScript <bibref role="normative" ref="ECMAScript"/> (an industry-standard scripting
      language based on JavaScript <bibref role="informative" ref="JavaScript"/> and JScript
      <bibref role="informative" ref="JScript"/>). Because of language
      binding restrictions, a mapping has to be applied between the OMG
      IDL and the programming language in used. For example, while the
      DOM uses IDL attributes in the definition of interfaces, Java does
    not allow interfaces to contain attributes:</p>

    <eg role="code" xml:space="preserve">// example 1: removing the first child of an element using ECMAScript
mySecondTrElement.removeChild(mySecondTrElement.firstChild);

// example 2: removing the first child of an element using Java
mySecondTrElement.removeChild(mySecondTrElement.getFirstChild());</eg>
    <note><p>OMG IDL is used only as a language-independent and
	implementation-neutral way to specify <termref def="dt-interface">interfaces</termref>. Various other
	IDLs could have been used (<bibref role="informative" ref="COM"/>, <bibref role="informative" ref="JavaIDL"/>, <bibref role="informative" ref="MSIDL"/>, ...). In general, IDLs 
	are designed for specific computing environments. The Document Object
	Model can be implemented in any computing environment, and does not 
	require the object binding runtimes generally associated with 
	such IDLs.
      </p></note>

  </div2>
  <div2 id="ID-E7C30821">
    <head>What the Document Object Model is</head>
    <p>The DOM is a programming <termref def="dt-API">API</termref> for documents.
      It is based on an object structure that closely resembles the structure of the
      documents it <termref def="dt-model">models</termref>. For instance, consider this table, taken
      from an XHTML document: </p>
    <eg role="code" xml:space="preserve">&lt;table&gt;
  &lt;tbody&gt; 
    &lt;tr&gt; 
      &lt;td&gt;Shady Grove&lt;/td&gt;
      &lt;td&gt;Aeolian&lt;/td&gt; 
    &lt;/tr&gt; 
    &lt;tr&gt;
      &lt;td&gt;Over the River, Charlie&lt;/td&gt;        
      &lt;td&gt;Dorian&lt;/td&gt; 
    &lt;/tr&gt; 
  &lt;/tbody&gt;
&lt;/table&gt;</eg> 
    <p>
      A graphical representation of the DOM of the example table, with
      whitespaces in element content (often abusively called "ignorable
      whitespace") removed, is:      
    </p>
    <graphic xmlns:xlink="http://www.w3.org/1999/xlink" source="./images/table.png" alt="graphical representation of the DOM of the example table" xlink:type="simple" xlink:show="embed" xlink:actuate="onLoad"/>
    <p>
      An example of DOM manipulation using ECMAScript would be:
    </p>
<eg role="code" xml:space="preserve">// access the tbody element from the table element
var myTbodyElement = myTableElement.firstChild;

// access its second tr element
// The list of children starts at 0 (and not 1).
var mySecondTrElement = myTbodyElement.childNodes[1];

// remove its first td element
mySecondTrElement.removeChild(mySecondTrElement.firstChild);

// change the text content of the remaining td element
mySecondTrElement.firstChild.firstChild.data = "Peter";</eg>
    <p>In the DOM, documents have a logical
      structure which is very much like a tree; to be more precise, which is
      like a "forest" or "grove",
      which can contain more than one tree. Each document contains zero or one
      doctype nodes, one document element node,
      and zero or more comments 
		or processing instructions; the document element serves as the root
		of the element tree for the document. However, the DOM
      does not specify that documents must be <emph>implemented</emph> as a
      tree or a grove<!--but not the same as an sgml grove-->, nor
      does it specify how the relationships among objects be
      implemented. The DOM is a logical model that may be implemented in any
      convenient manner. In this
      specification, we use the term <emph>structure model</emph> to
      describe the tree-like representation of a document.
      We also use the term "tree" when referring to the arrangement of 
      those information items which can be reached by using "tree-walking" 
      methods; (this does not include attributes).
      One important property of DOM structure models
      is <emph>structural isomorphism</emph>: if any two Document
      Object Model implementations are used to create a representation
      of the same document, they will create the same structure model,
      in accordance with the XML Information Set <bibref role="informative" ref="InfoSet"/>.</p>
    <note><p>There may be some variations depending on the parser being
	used to build the DOM. For instance, the DOM may not contain
	white spaces in element content if the parser discards them.</p>
    </note>
      <p>The name "Document Object Model" was chosen because
      it is an "<termref def="dt-object-model">object model</termref>" in the traditional
      object oriented design sense: documents are modeled using
      objects, and the model encompasses not only the structure of a
      document, but also the behavior of a document and the objects
      of which it is composed. In other words, the nodes in the
      above diagram do not represent a data structure, they
      represent objects, which have functions and identity. As an
      object model, the DOM identifies:</p>
    <ulist>
      <item><p>the interfaces and objects used to represent and manipulate
	  a document</p></item>
      <item><p>the semantics of these interfaces and objects - including
	  both behavior and attributes</p></item>
      <item><p>the relationships and collaborations among these interfaces
	  and objects</p></item>
    </ulist>
    
    <p>The structure of SGML documents has traditionally been
      represented by an abstract <termref def="dt-datamodel">data model</termref>, not by an object model.
      In an abstract <termref def="dt-datamodel">data model</termref>, the model is centered around the
      data. In object oriented programming languages, the data itself
      is encapsulated in objects that hide the data, protecting it
      from direct external manipulation. The functions associated with
      these objects determine how the objects may be manipulated, and
      they are part of the object model.</p>

  </div2>
  <div2 id="ID-E7C30822">
    <head>What the Document Object Model is not</head>
    <p>This section is designed to give a more precise understanding
      of the DOM by distinguishing it from other
      systems that may seem to be like it.</p>
    <ulist>
      <item><p>The Document Object Model is not a binary specification.
	  DOM programs written in the same language binding will be
	  source code compatible across platforms, but the DOM
	  does not define any form of binary interoperability.</p></item>
      <item><p>The Document Object Model is not a way of persisting objects
	  to XML or HTML. Instead of specifying how objects may be
	  represented in XML, the DOM specifies how
	  XML and HTML documents are represented as objects, so that
	  they may be used in object oriented programs.</p></item>
      <item><p>The Document Object Model is not a set of data structures;
	  it is an <termref def="dt-object-model">object model</termref> that specifies interfaces. Although this
	  document contains diagrams showing parent/child relationships,
	  these are logical relationships defined by the programming
	  interfaces, not representations of any particular internal
	  data structures.</p></item>

      <item><p>The Document Object Model does not define what information in a
	  document is relevant or how information in a document is structured. For
	  XML, this is specified by the XML Information Set <bibref role="informative" ref="InfoSet"/>. The DOM is simply an <termref def="dt-API">API</termref> to this information set. <!-- @@SEEME
	  --></p></item>

      <item><p>The Document Object Model, despite its name, is not a
	  competitor to the Component Object Model <bibref role="informative" ref="COM"/>. COM, like
	  CORBA, is a language independent way to specify interfaces and
	  objects; the DOM is a set of interfaces and
	  objects designed for managing HTML and XML documents. The DOM
	  may be implemented using language-independent systems like COM
	  or CORBA; it may also be implemented using language-specific
	  bindings like the Java or ECMAScript bindings specified in
	  this document.</p></item>
    </ulist>
  </div2>
  <div2 id="ID-E7C30823">
    <head>Where the Document Object Model came from</head>
    <p>The DOM originated as a specification to
      allow JavaScript scripts and Java programs to be portable among
      Web browsers.  "Dynamic HTML" was  the immediate ancestor of the
      Document Object Model, and it was originally thought of largely
      in terms of  browsers. However, when the DOM
      Working Group was formed at W3C, it was also joined by vendors in other
      domains, including HTML or XML editors and document
      repositories. Several of these vendors had worked with SGML
      before XML was developed; as a result, the DOM
      has been influenced by SGML Groves and the HyTime standard. Some
      of these vendors had also developed their own object models for
      documents in order to provide an API for SGML/XML
      editors or document repositories, and these object models have
      also influenced the DOM.</p>
  </div2>
  

  <div2 id="ID-E7C30824"><head>Entities and the DOM Core</head>
    <p>In the fundamental DOM interfaces, there are no objects representing
      entities. Numeric character references, and references to the
      pre-defined entities in HTML and XML, are replaced by the
      single character that makes up the entity's replacement.
      For example, in:   
    </p>
      <eg role="code" xml:space="preserve">
        &lt;p&gt;This is a dog &amp;amp; a cat&lt;/p&gt;        
      </eg>
    <p>
      the "&amp;amp;" will be replaced by the character "&amp;", and the text
      in the P element will form a single continuous sequence of
      characters. Since numeric character references and pre-defined entities
      are not recognized as such in CDATA sections, or in the SCRIPT and STYLE
      elements in HTML, they are not replaced by the single character they
      appear to refer to. If the example above were enclosed in a CDATA
      section, the "&amp;amp;" would not be replaced by "&amp;"; neither would
      the &lt;p&gt; be recognized as a start tag. The representation of general
      entities, both internal and external, are defined within the
      extended (XML) interfaces of <specref ref="Core"/>.</p>
    <p>
      Note: When a DOM representation of a document is serialized
      as XML or HTML text, applications will need to check each
      character in text data to see if it needs to be escaped
      using a numeric or pre-defined entity. Failing to do so
      could result in invalid HTML or XML. Also, <termref def="dt-implementation">implementations</termref> should be
      aware of the fact that serialization into a character encoding
      ("charset") that does not fully cover ISO 10646 may fail if there are
      characters in markup or CDATA sections that are not present in the
      encoding.</p>
  </div2>

  <div2 id="DOMArchitecture">
    <head>DOM Architecture</head>
    <p>
      The DOM specifications provide a set of APIs that forms the DOM
      API. Each DOM specification defines one or more modules and each
      module is associated with one feature name. For example, the DOM
      Core specification (this specification) defines two modules:
    </p>
    <ulist>
      <item>
	<p>The Core module, which contains the fundamental interfaces
	  that must be implemented by all DOM conformant
	  implementations, is associated with the feature name "Core";</p>
      </item>
      <item>
	<p>
	  The XML module, which contains the interfaces that must be
	  implemented by all conformant XML 1.0 <bibref ref="XML" role="informative"/> (and higher) DOM implementations, is
	  associated with the feature name "XML".
	</p>
      </item>
    </ulist>
    <p>
      The following representation contains all DOM modules, represented
      using their feature names, defined along the DOM specifications:
    </p>
    <graphic xmlns:xlink="http://www.w3.org/1999/xlink" source="./images/dom-architecture.png" alt="A view of the DOM Architecture" xlink:type="simple" xlink:show="embed" xlink:actuate="onLoad"/>
    <p>
      A DOM implementation can then implement one (i.e. only the Core
      module) or more modules depending on the host application. A Web
      user agent is very likely to implement the "MouseEvents" module,
      while a server-side application will have no use of this module
      and will probably not implement it.
    </p>
  </div2>

  <div2 id="ID-Conformance">
    <head>Conformance</head>
    <p>
      This section explains the different levels of conformance to DOM Level 3.
      DOM Level 3 consists of 16 modules. It is possible to conform to DOM
      Level 3, or to a DOM Level 3 module.
    </p>

    <p>
      An implementation is DOM Level 3 conformant if it supports the Core
      module defined in this document (see <specref ref="ID-BBACDC08"/>). An
      implementation conforms to a DOM Level 3 module if it supports all the
      interfaces for that module and the associated semantics.
    </p>
    <p>
      Here is the complete list of DOM Level 3.0 modules and the features used
      by them.  Feature names are case-insensitive.
    </p>

    <glist>
      <gitem>
	<label>Core module</label>
	<def>
	  <p>
	    defines the feature <xspecref xmlns:xlink="http://www.w3.org/1999/xlink" href="core.html#ID-BBACDC08" xlink:type="simple" xlink:show="new" xlink:actuate="onRequest">"Core"</xspecref>.
	  </p>
	</def>
      </gitem>
      <gitem>
	<label>XML module</label>
	<def>
	  <p>
	    Defines the feature <xspecref xmlns:xlink="http://www.w3.org/1999/xlink" href="core.html#ID-E067D597" xlink:type="simple" xlink:show="new" xlink:actuate="onRequest">"XML"</xspecref>.
	  </p>
	</def>
      </gitem>
      <gitem>
	<label>Events module</label>
	<def>
	  <p>defines the feature <xspecref xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/TR/DOM-Level-3-Events/events.html" xlink:type="simple" xlink:show="new" xlink:actuate="onRequest">"Events"</xspecref> in <bibref role="informative" ref="DOMEvents"/>.</p>
	</def>
      </gitem>
      <gitem>
	<label>User interface Events module</label>
	<def>
	  <p>defines the feature <xspecref xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/TR/DOM-Level-3-Events/events.html" xlink:type="simple" xlink:show="new" xlink:actuate="onRequest">"UIEvents"</xspecref> in
	  <bibref role="informative" ref="DOMEvents"/>.</p>
	</def>
      </gitem>
      <gitem>
	<label>Mouse Events module</label>
	<def>
	  <p>defines the feature <xspecref xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/TR/DOM-Level-3-Events/events.html" xlink:type="simple" xlink:show="new" xlink:actuate="onRequest">"MouseEvents"</xspecref> in
	  <bibref role="informative" ref="DOMEvents"/>.</p>
	</def>
      </gitem>
      <gitem>
	<label>Text Events module</label>
	<def>
	  <p>defines the feature <xspecref xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/TR/DOM-Level-3-Events/events.html" xlink:type="simple" xlink:show="new" xlink:actuate="onRequest">"TextEvents"</xspecref> in
	  <bibref role="informative" ref="DOMEvents"/>.</p>
	</def>
      </gitem>
      <gitem>
	<label>Keyboard Events module</label>
	<def>
	  <p>defines the feature <xspecref xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/TR/DOM-Level-3-Events/events.html" xlink:type="simple" xlink:show="new" xlink:actuate="onRequest">"KeyboardEvents"</xspecref> in
	  <bibref role="informative" ref="DOMEvents"/>.</p>
	</def>
      </gitem>
      <gitem>
	<label>Mutation Events module</label>
	<def>
	  <p>defines the feature <xspecref xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/TR/DOM-Level-3-Events/events.html" xlink:type="simple" xlink:show="new" xlink:actuate="onRequest">"MutationEvents"</xspecref> in
	  <bibref role="informative" ref="DOMEvents"/>.</p>
	</def>
      </gitem>
      <gitem>
	<label>Mutation name Events module</label>
	<def>
	  <p>defines the feature <xspecref xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/TR/DOM-Level-3-Events/events.html" xlink:type="simple" xlink:show="new" xlink:actuate="onRequest">"MutationNameEvents"</xspecref> in
	  <bibref role="informative" ref="DOMEvents"/>.</p>
	</def>
      </gitem>
      <gitem>
	<label>HTML Events module</label>
	<def>
	  <p>defines the feature <xspecref xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/TR/DOM-Level-3-Events/events.html" xlink:type="simple" xlink:show="new" xlink:actuate="onRequest">"HTMLEvents"</xspecref> in
	  <bibref role="informative" ref="DOMEvents"/>.</p>
	</def>
      </gitem>
      <gitem>
	<label>Load and Save module</label>
	<def>
	  <p>defines the feature <xspecref xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/TR/DOM-Level-3-LS/load-save.html" xlink:type="simple" xlink:show="new" xlink:actuate="onRequest">"LS"</xspecref> in <bibref role="informative" ref="DOMLS"/>.</p>
	</def>
      </gitem>
      <gitem>
	<label>Asynchronous load module</label>
	<def>
	  <p>defines the feature <xspecref xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/TR/DOM-Level-3-LS/load-save.html" xlink:type="simple" xlink:show="new" xlink:actuate="onRequest">"LS-Async"</xspecref>
	  in <bibref role="informative" ref="DOMLS"/>.</p>
	</def>
      </gitem>
      <gitem>
	<label>Validation module</label>
	<def>
	  <p>defines the feature <xspecref xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/TR/DOM-Level-3-Val/validation.html" xlink:type="simple" xlink:show="new" xlink:actuate="onRequest">"Validation"</xspecref>
	  in <bibref role="informative" ref="DOMVal"/>.</p>
	</def>
      </gitem>
      <gitem>
	<label>XPath module</label>
	<def>
	  <p>defines the feature <xspecref xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html" xlink:type="simple" xlink:show="new" xlink:actuate="onRequest">"XPath"</xspecref> in
	   <bibref role="informative" ref="DOMXPath"/>.</p>
	</def>
      </gitem>
    </glist>
    
    <p>
      A DOM implementation must not return <code>true</code> to the
      <code>DOMImplementation.hasFeature(feature, version)</code> <termref def="dt-method">method</termref> of the <code>DOMImplementation</code>
      interface for that feature unless the implementation conforms to that
      module. The <code>version</code> number for all features used in DOM
      Level 3.0 is <code>"3.0"</code>.
    </p>
  </div2>

  <div2 id="ID-E7C30826"><head>DOM Interfaces and DOM Implementations</head>

    <p>The DOM specifies interfaces which may be used to manage XML or
      HTML documents. It is important to realize that these interfaces
      are an abstraction - much like "abstract base classes" in C++,
      they are a means of specifying a way to access and manipulate an
      application's internal representation of a document. Interfaces 
	do not imply a particular concrete
      implementation. Each DOM application is free to maintain
      documents in any convenient representation, as long as the
      interfaces shown in this specification are supported. Some
      DOM implementations will be existing programs that use the
      DOM interfaces to access software written long before the
      DOM specification existed. Therefore, the DOM is designed
      to avoid implementation dependencies; in particular,</p>
    <olist>
      <item><p>Attributes defined in the IDL do not imply concrete
	  objects which must have specific data members - in the
	  language bindings, they are translated to a pair of
	  get()/set() functions, not to a data member. Read-only
	  attributes have only a get() function in the language
	  bindings.  </p>
      </item>
      <item><p>DOM applications may provide additional interfaces
	  and objects not found in this specification and still be
	  considered DOM conformant.</p></item>
      <item><p>Because we specify interfaces and not the actual
	  objects that are to be created, the DOM cannot know what
	  constructors to call for an implementation.  In general,
	  DOM users call the createX() methods on the Document
	  class to create document structures, and DOM
	  implementations create their own internal representations
	  of these structures in their implementations of the
	  createX() functions.
	</p></item>
    </olist>
    <p>
      The Level 2 interfaces were extended to provide both Level 2 and Level 3
      functionality.
    </p>
    <p>
      DOM implementations in languages other than Java or ECMAScript may choose
      bindings that are appropriate and natural for their language and run time
      environment.  For example, some systems may need to create a Document3
      class which inherits from a Document class and contains the new methods
      and attributes.
    </p>
    <p>DOM Level 3 does not specify multithreading mechanisms.</p>
  </div2>
</div1>
<!--
  *************************************************************************
  * END OF DOM INTRODUCTION                                               *
  *************************************************************************
-->


</front> 
 
<body>
  
<!-- $Id: xml-source.xml,v 1.5 2004/02/04 22:41:13 plehegar Exp $ -->
<!--
 *************************************************************************
 * BEGINNING OF CORE                                                     *
 *************************************************************************
-->
<div1 id="Core">
  <head>Document Object Model Core</head>
  <orglist role="editors">
    <member>
      <name>Arnaud Le Hors</name>
      <affiliation>IBM</affiliation>
    </member>
    <member>
      <name>Philippe Le H&#233;garet</name>
      <affiliation>W3C</affiliation>
    </member>
    <member>
      <name>Gavin Nicol</name>
      <affiliation>Inso EPS (for DOM Level 1)</affiliation>
    </member>
    <member>
      <name>Lauren Wood</name>
      <affiliation>SoftQuad, Inc. (for DOM Level 1)</affiliation>
    </member>
    <member>
      <name>Mike Champion</name>
      <affiliation>Arbortext and Software AG (for DOM Level 1 from November 20,
        1997)</affiliation>
    </member>
    <member>
      <name>Steve Byrne</name>
      <affiliation>JavaSoft (for DOM Level 1 until November 19,
        1997)</affiliation>
    </member>
  </orglist>
  <?GENERATE-MINI-TOC?>

  <p>
    This specification defines a set of objects and interfaces for
    accessing and manipulating document objects. The functionality
    specified (the <emph>Core</emph> functionality) is sufficient to
    allow software developers and Web script authors to access and
    manipulate parsed HTML <bibref role="informative" ref="HTML40"/> and
    XML <bibref role="informative" ref="XML"/> content inside conforming
    products. The DOM Core <termref def="dt-API">API</termref> also
    allows creation and population of a <code>Document</code> object
    using only DOM API calls. A solution for loading a
    <code>Document</code> and saving it persistently is proposed in
    <bibref role="informative" ref="DOMLS"/>.
  </p>

  <!--
  ******************************************************
  | INTRODUCTION                                       |
  ******************************************************
  -->
  <div2 id="ID-1590626201">
    <head>Overview of the DOM Core Interfaces</head>

    <div3 id="ID-1590626202"><head>The DOM Structure Model</head>	
      <p>The DOM presents documents as a hierarchy of <code>Node</code> objects
        that also implement other, more specialized interfaces. Some types of
        nodes may have <termref def="dt-child">child</termref> nodes of various
        types, and others are leaf nodes that cannot have anything below them
        in the document structure. For XML and HTML, the node types, and which
        node types they may have as children, are as follows:
        <ulist>	
          <item>
            <p><code>Document</code> -- <code>Element</code> (maximum of one),
              <code>ProcessingInstruction</code>, <code>Comment</code>,
              <code>DocumentType</code> (maximum of one) </p>
          </item>	
          <item>
            <p><code>DocumentFragment</code> -- <code>Element</code>,
              <code>ProcessingInstruction</code>, <code>Comment</code>,
              <code>Text</code>, <code>CDATASection</code>,
              <code>EntityReference</code> </p>
          </item>	
          <item>
            <p><code>DocumentType</code> -- no children</p>
          </item>	
          <item>
            <p><code>EntityReference</code> -- <code>Element</code>,
              <code>ProcessingInstruction</code>, <code>Comment</code>,
              <code>Text</code>, <code>CDATASection</code>,
              <code>EntityReference</code> </p>
          </item>	
          <item>
            <p><code>Element</code> -- <code>Element</code>, <code>Text</code>,
              <code>Comment</code>, <code>ProcessingInstruction</code>,
              <code>CDATASection</code>, <code>EntityReference</code></p>
          </item>	
          <item>
            <p><code>Attr</code> -- <code>Text</code>,
              <code>EntityReference</code></p>
          </item>	
          <item>
            <p><code>ProcessingInstruction</code> -- no children</p>
          </item>	
          <item>
            <p><code>Comment</code> -- no children</p>
          </item>	
          <item>
            <p><code>Text</code> -- no children</p>
          </item>	
          <item>
            <p><code>CDATASection</code> -- no children</p>
          </item>	
          <item>
            <p><code>Entity</code> -- <code>Element</code>,
              <code>ProcessingInstruction</code>, <code>Comment</code>,
              <code>Text</code>, <code>CDATASection</code>,
              <code>EntityReference</code></p>
          </item>	
          <item>
            <p><code>Notation</code> -- no children</p>
          </item>	
        </ulist> </p>
      <p>The DOM also specifies a <code>NodeList</code> interface to handle
        ordered lists of <code>Nodes</code>, such as the children of a
        <code>Node</code>, or the <termref def="dt-element">elements</termref>
        returned by the
	<code>Element.getElementsByTagNameNS(namespaceURI, localName)</code> method, and also a <code>NamedNodeMap</code>
        interface to handle unordered sets of nodes referenced by their name
        attribute, such as the attributes of an <code>Element</code>.
        <termdef id="td-live" term="live"> <code>NodeList</code> and
          <code>NamedNodeMap</code> objects in the DOM are <term>live</term>;
          that is, changes to the underlying document structure are reflected
          in all relevant <code>NodeList</code> and <code>NamedNodeMap</code>
          objects. For example, if a DOM user gets a <code>NodeList</code>
          object containing the children of an <code>Element</code>, then
          subsequently adds more children to that
          <termref def="dt-element">element</termref> (or removes children, or
          modifies them), those changes are automatically reflected in the
          <code>NodeList</code>, without further action on the user's
          part. Likewise, changes to a <code>Node</code> in the tree are
          reflected in all references to that <code>Node</code> in
          <code>NodeList</code> and <code>NamedNodeMap</code>
          objects.</termdef></p> <p>Finally, the interfaces <code>Text</code>,
        <code>Comment</code>, and <code>CDATASection</code> all inherit from
        the <code>CharacterData</code> interface.</p>
    </div3>
    <div3 id="ID-249F15BA"><head>Memory Management</head>
      <p>Most of the APIs defined by this specification are
        <emph>interfaces</emph> rather than classes. That means that an
        implementation need only expose methods with the defined names and
        specified operation, not implement classes that correspond directly to
        the interfaces. This allows the DOM APIs to be implemented as a thin
        veneer on top of legacy applications with their own data structures, or
        on top of newer applications with different class hierarchies. This
        also means that ordinary constructors (in the Java or C++ sense) cannot
        be used to create DOM objects, since the underlying objects to be
        constructed may have little relationship to the DOM interfaces. The
        conventional solution to this in object-oriented design is to define
        <emph>factory</emph> methods that create instances of objects that
        implement the various interfaces. Objects implementing some interface
        "X" are created by a "createX()" method on the <code>Document</code>
        interface; this is because all DOM objects live in the context of a
        specific Document.</p>
      <p>The Core DOM APIs are designed to be compatible with a wide range of
        languages, including both general-user scripting languages and the more
        challenging languages used mostly by professional programmers. Thus,
        the DOM APIs need to operate across a variety of memory management
        philosophies, from language bindings that do not expose memory
        management to the user at all, through those (notably Java) that
        provide explicit constructors but provide an automatic garbage
        collection mechanism to automatically reclaim unused memory, to those
        (especially C/C++) that generally require the programmer to explicitly
        allocate object memory, track where it is used, and explicitly free it
        for re-use. To ensure a consistent API across these platforms, the DOM
        does not address memory management issues at all, but instead leaves
        these for the implementation. Neither of the explicit language bindings
        defined by the DOM API (for
        <termref def="dt-ECMAScript">ECMAScript</termref> and Java) require any
        memory management methods, but DOM bindings for other languages
        (especially C or C++) may require such support. These extensions will
        be the responsibility of those adapting the DOM API to a specific
        language, not the DOM Working Group.</p>
    </div3>
    <div3 id="ID-45A944CB">
      <head>Naming Conventions</head>
      <p>While it would be nice to have attribute and method names that are
        short, informative, internally consistent, and familiar to users of
        similar APIs, the names also should not clash with the names in legacy
        APIs supported by DOM implementations. Furthermore, both OMG IDL  <bibref role="informative" ref="OMGIDL"/> and ECMAScript <bibref role="informative" ref="ECMAScript"/> have significant limitations in their ability
        to disambiguate names from different namespaces that make it difficult
        to avoid naming conflicts with short, familiar names. So, DOM names
        tend to be long and descriptive in order to be unique across all
        environments.</p>
      <p>The Working Group has also attempted to be internally consistent in
        its use of various terms, even though these may not be common
        distinctions in other APIs. For example, the DOM API uses the method
        name "remove" when the method changes the structural model, and the
        method name "delete" when the method gets rid of something inside the
        structure model. The thing that is deleted is not returned. The thing
        that is removed may be returned, when it makes sense to return it.</p>
    </div3>
    <div3 id="ID-1CED5498">
      <head>Inheritance vs. Flattened Views of the API</head>
      <p>The DOM Core <termref def="dt-API">APIs</termref> present two somewhat
        different sets of interfaces to an XML/HTML document: one presenting an
        "object oriented" approach with a hierarchy of
        <termref def="dt-inheritance">inheritance</termref>, and a "simplified"
        view that allows all manipulation to be done via the <code>Node</code>
        interface without requiring casts (in Java and other C-like languages)
        or query interface calls in <termref def="dt-COM">COM</termref>
        environments. These operations are fairly expensive in Java and COM,
        and the DOM may be used in performance-critical environments, so we
        allow significant functionality using just the <code>Node</code>
        interface. Because many other users will find the
        <termref def="dt-inheritance">inheritance</termref> hierarchy easier to
        understand than the "everything is a <code>Node</code>" approach to the
        DOM, we also support the full higher-level interfaces for those who
        prefer a more object-oriented <termref def="dt-API">API</termref>. </p>
      <p>In practice, this means that there is a certain amount of redundancy
        in the <termref def="dt-API">API</termref>. The Working Group considers
        the "<termref def="dt-inheritance">inheritance</termref>" approach the
        primary view of the API, and the full set of functionality on
        <code>Node</code> to be "extra" functionality that users may employ,
        but that does not eliminate the need for methods on other interfaces
        that an object-oriented analysis would dictate. (Of course, when the
        O-O analysis yields an attribute or method that is identical to one on
        the <code>Node</code> interface, we don't specify a completely
        redundant one.) Thus, even though there is a generic
        <code>Node.nodeName</code> attribute on the <code>Node</code> interface,
        there is still a <code>Element.tagName</code> attribute on the
        <code>Element</code> interface; these two attributes must contain the
        same value, but the it is worthwhile to support both, given the
        different constituencies the DOM <termref def="dt-API">API</termref>
        must satisfy.</p>
    </div3>
  </div2>
  <div2 id="BasicTypes">
    <head>Basic types</head>

    <p>
      To ensure interoperability, this specification specifies the following
      basic types used in various DOM modules. Even though the DOM
      uses the basic types in the interfaces, bindings may use
      different types and normative bindings are only given for Java and
      ECMAScript in this specification.
    </p>

    <div3 id="ID-C74D1578">
      <head>The <code>DOMString</code> type</head>

      <p>
	The <code>DOMString</code> type is used to store <bibref ref="Unicode"/> characters as a sequence of <termref def="dt-16-bit-unit">16-bit units</termref> using UTF-16 as
	defined in <bibref ref="Unicode"/> and Amendment 1 of <bibref ref="ISO10646"/>.
      </p>
      <p>
	Characters are <loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/TR/2004/REC-xml11-20040204/#dt-fullnorm" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">fully
	normalized</loc> as defined in appendix B of <bibref ref="XML11"/> if:
      </p>
      <ulist>
	<item>
	  <p>
	    the parameter "<termref def="parameter-normalize-characters">normalize-characters</termref>"
	    was set to <code>true</code> while loading the document or
	    the document was certified as defined in <bibref ref="XML11"/>;
	  </p>
	</item>
	<item>
	  <p>
	    the parameter "<termref def="parameter-normalize-characters">normalize-characters</termref>"
	    was set to <code>true</code> while using the method
	    <code>Document.normalizeDocument()</code>, or while using
	    the method <code>Node.normalize()</code>;
	  </p>
	</item>
      </ulist>
      <p>
	Note that, with the exceptions of
	<code>Document.normalizeDocument()</code> and
	<code>Node.normalize()</code>, manipulating characters using DOM
	methods does not guarantee to preserve a
	<term>fully-normalized</term> text.
      </p>
      <definitions>
	<typedef name="DOMString" id="DOMString">
	  <descr>
	    <p>A <code>DOMString</code> is a sequence of
	      <termref def="dt-16-bit-unit">16-bit units</termref>.</p>
	  </descr>
	  <sequence type="unsigned short"/>
	</typedef>
      </definitions>	
      <p><!--empty paragraph--></p>
      <p>The UTF-16 encoding was chosen because of its widespread industry
      practice. Note that for both HTML and XML, the document character set
      (and therefore the notation of numeric character references) is based on
      UCS <bibref ref="ISO10646"/>. A single numeric character reference in a
      source document may therefore in some cases correspond to two 16-bit
      units in a <code>DOMString</code> (a high surrogate and a low
	surrogate). For issues related to string comparisons, refer to
	<specref ref="ID-5DFED1F0"/>.</p>
      <p>
	For Java and ECMAScript, <code>DOMString</code> is bound to the
	<code>String</code> type because both languages also use UTF-16
	as their encoding.
      </p>
      <note>
        <p>As of August 2000, the OMG IDL specification
          (<bibref ref="OMGIDL"/>) included a <code>wstring</code>
            type. However, that definition did not meet the interoperability
            criteria of the DOM <termref def="dt-API">API</termref> since it
            relied on negotiation to decide the width and encoding of a
            character.</p>
      </note>
    </div3>
    <div3 id="Core-DOMTimeStamp">
      <head>The <code>DOMTimeStamp</code> type</head>
      
      <p>
	The <code>DOMTimeStamp</code> type is used to store an absolute
	or relative time.
      </p>	
      <definitions>
	<typedef name="DOMTimeStamp" id="DOMTimeStamp">
	  <descr>
	    <p>A <code>DOMTimeStamp</code> represents a number of
	      milliseconds.</p>
	  </descr>
	  <typename>unsigned long long</typename>
	</typedef>
      </definitions>	 
      <p>
	For Java, <code>DOMTimeStamp</code> is bound to the
	<code>long</code> type. For ECMAScript, <code>DOMTimeStamp</code>
	is bound to the <code>Date</code> type because the range of the
	<code>integer</code> type is too small.
      </p>
    </div3>
    <div3 id="Core-DOMUserData">
      <head>The <code>DOMUserData</code> type</head>
      <p>
	The <code>DOMUserData</code> type is used to store
	application data.
      </p>
      <definitions>
	<typedef name="DOMUserData" id="DOMUserData">
	  <descr>
	    <p>A <code>DOMUserData</code> represents a reference to
              application data.</p>
	  </descr>
	  <typename>any</typename>
	</typedef>
      </definitions>
      <p>
	For Java, <code>DOMUserData</code> is bound to the
	<code>Object</code> type. For ECMAScript,
	<code>DOMUserData</code> is bound to <code>any type</code>.
      </p>
    </div3>
    <div3 id="Core-DOMObject">
      <head>The <code>DOMObject</code> type</head>
      <p>
	The <code>DOMObject</code> type is used to represent an
	  object.
      </p>
      <definitions>
	<typedef name="DOMObject" id="DOMObject">
	  <descr>
	    <p>A <code>DOMObject</code> represents an object reference.</p>
	  </descr>
	  <typename>Object</typename>
	</typedef>
      </definitions>
      <p>
	For Java and ECMAScript, <code>DOMObject</code> is bound to the
	<code>Object</code> type.
      </p>
    </div3>
  </div2>
  <div2 id="Consideration">
    <head>General considerations</head>

    <div3 id="ID-5DFED1F0">
      <head>String comparisons in the DOM</head>

      <p>The DOM has many interfaces that imply string matching. For
        XML, string comparisons are case-sensitive and performed with a
        binary <termref def="dt-string-compare">comparison</termref> of
        the <termref def="dt-16-bit-unit">16-bit units</termref> of the
        <code>DOMStrings</code>. However, for case-insensitive markup
        languages, such as HTML 4.01 or earlier, these comparisons are
        case-insensitive where appropriate.</p>

      <p>Note that HTML processors often perform specific case
        normalizations (canonicalization) of the markup before the DOM
        structures are built. This is typically using uppercase for
        <termref def="dt-element">element</termref> names and lowercase
        for attribute names. For this reason, applications should also
        compare element and attribute names returned by the DOM
        implementation in a case-insensitive manner.</p>

      <p>
	The character normalization, i.e. transforming into their <loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/TR/2004/REC-xml11-20040204/#dt-fullnorm" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">fully normalized</loc> form as
	as defined in <bibref ref="XML11"/>, is assumed to happen at
	serialization time. The DOM Level 3 Load and Save module <bibref role="informative" ref="DOMLS"/> provides a serialization
	mechanism (see the <code>DOMSerializer</code> interface, section
	2.3.1) and uses the <code>DOMConfiguration</code> parameters
	"<termref def="parameter-normalize-characters">normalize-characters</termref>"
	and "<termref def="parameter-check-character-normalization">check-character-normalization</termref>"
	to assure that text is <loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/TR/2004/REC-xml11-20040204/#dt-fullnorm" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">fully normalized</loc> <bibref ref="XML11"/>. Other serialization mechanisms built on top of
	the DOM Level 3 Core also have to assure that text is
	<term>fully normalized</term>.
      </p>

<!--
      <note>	
        <p>Besides case folding, there are additional normalizations that can
          be applied to text. The W3C I18N Working Group is in the process of
          defining exactly which normalizations are necessary, and where they
          should be applied. The W3C I18N Working Group expects to require
          early normalization, which means that data read into the DOM is
          assumed to already be normalized. The DOM and applications built on
          top of it in this case only have to assure that text remains
          normalized when being changed. For further details, please see
          <bibref ref="Charmod"/>.</p>
      </note>
-->
    </div3>

    <div3 id="domURIs">
      <head>DOM URIs</head>

      <p>
	The DOM specification relies on <code>DOMString</code> values as
	resource identifiers, such that the following conditions are
	met:
      </p>
      <olist>
	<item>
	  <p>
	    An absolute identifier absolutely identifies a resource on
	    the Web;
	  </p>
	</item>
	<item>
	  <p>
	    Simple string equality establishes equality of absolute
	    resource identifiers, and no other equivalence of resource
	    identifiers is considered significant to the DOM
	    specification;
	  </p>
	</item>
	<item>
	  <p>
	    A relative identifier is easily detected and made absolute
	    relative to an absolute identifier;
	  </p>
	</item>
	<item>
	  <p>
	    Retrieval of content of a resource may be accomplished where
	    required.
	  </p>
	</item>
      </olist>

      <p>
	The term "<term>absolute URI</term>" refers to a complete
	resource identifier and the term "<term>relative URI</term>"
	refers to an incomplete resource identifier.
      </p>
      <p>
	Within the DOM specifications, these identifiers are called
	URIs, "Uniform Resource Identifiers", but this is meant
	abstractly. The DOM implementation does not necessarily process
	its URIs according to the URI specification <bibref role="informative" ref="URIRef"/>.  Generally the particular
	form of these identifiers must be ignored.
      </p>
      <p>
	When is not possible to completely ignore the type of a DOM URI,
	either because a relative identifier must be made absolute or
	because content must be retrieved, the DOM implementation must
	at least support identifier types appropriate to the content
	being processed.  <bibref role="informative" ref="HTML40"/>,
	<bibref role="informative" ref="XML"/>, and associated namespace
	specification <bibref role="informative" ref="Namespaces"/> rely
	on <bibref role="informative" ref="URIRef"/> to determine
	permissible characters and resolving relative URIs.  Other
	specifications such as namespaces in XML 1.1 <bibref role="informative" ref="Namespaces11"/> may rely on alternative
	resource identifier types that may, for example, include
	non-ASCII characters, necessitating support for alternative
	resource identifier types where required by applicable
	specifications.
      </p>
    </div3>

    <div3 id="Namespaces-Considerations">
      <head>XML Namespaces</head>

      <p>
	DOM Level 2 and 3 support XML namespaces <bibref ref="Namespaces"/> by augmenting several interfaces of the DOM
	Level 1 Core to allow creating and manipulating <termref def="dt-element">elements</termref> and attributes associated to
	a namespace. When <bibref ref="XML11"/> is in use (see
	<code>Document.xmlVersion</code>), DOM Level 3 also supports
	<bibref ref="Namespaces11"/>.
      </p>
      <p>As far as the DOM is concerned, special attributes used for declaring
        XML namespaces are still
        exposed and can be manipulated just like any other attribute. However,
        nodes are permanently bound to <termref def="dt-namespaceURI">namespace
          URIs</termref> as they get created. Consequently, moving a node
        within a document, using the DOM, in no case results in a change of its
        <termref def="dt-namespaceprefix">namespace prefix</termref> or
        namespace URI. Similarly, creating a node with a namespace prefix and
        namespace URI, or changing the namespace prefix of a node, does not
        result in any addition, removal, or modification of any special
        attributes for declaring the appropriate XML namespaces. Namespace
        validation is not enforced; the DOM application is responsible. In
        particular, since the mapping between prefixes and namespace URIs is
        not enforced, in general, the resulting document cannot be serialized
        naively. For example, applications may have to declare every namespace
        in use when serializing a document.</p>
      <p>In general, the DOM implementation (and higher) doesn't perform any
        URI normalization or canonicalization. The URIs given to the DOM are
        assumed to be valid (e.g., characters such as white spaces are properly
        escaped), and no lexical checking is performed. Absolute URI references
        are treated as strings and <termref def="dt-string-compare">compared
          literally</termref>. How relative namespace URI references are
        treated is undefined. To ensure interoperability only absolute
        namespace URI references (i.e., URI references beginning with a scheme
        name and a colon) should be used. Applications should use the
	value <code>null</code> as the <code>namespaceURI</code>
	parameter 
	for methods if they wish to have no namespace. In programming
	languages where empty strings can be differentiated from null,
	empty strings, when given as a namespace URI, are converted to
	<code>null</code>.
	This is
	true even though the DOM does no lexical checking of URIs.</p> 
      <note>
	<p>
	  <code>Element.setAttributeNS(null, ...)</code> puts the attribute in
	  the <term>per-element-type partitions</term> as defined in
	  <xspecref xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/TR/1999/REC-xml-names-19990114" xlink:type="simple" xlink:show="new" xlink:actuate="onRequest">XML Namespace
	  Partitions</xspecref> in <bibref ref="Namespaces"/>.
	</p>
      </note>
      <note>
        <p>In the DOM, all namespace declaration attributes are <emph>by
            definition</emph> bound to the namespace URI:
          "<loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/2000/xmlns/" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">http://www.w3.org/2000/xmlns/</loc>". These are the attributes
          whose <termref def="dt-namespaceprefix">namespace prefix</termref> or
          <termref def="dt-qualifiedname">qualified name</termref> is
          "xmlns" as introduced in <bibref ref="Namespaces11"/>.</p>
      </note>
      <p>In a document with no namespaces, the
        <termref def="dt-child">child</termref> list of an
        <code>EntityReference</code> node is always the same as that of the
        corresponding <code>Entity</code>. This is not true in a document where
        an entity contains unbound <termref def="dt-namespaceprefix">namespace
          prefixes</termref>. In such a case, the
        <termref def="dt-descendant">descendants</termref> of the corresponding
        <code>EntityReference</code> nodes may be bound to different
        <termref def="dt-namespaceURI">namespace URIs</termref>, depending on
        where the entity references are. Also, because, in the DOM, nodes
        always remain bound to the same namespace URI, moving such
        <code>EntityReference</code> nodes can lead to documents that cannot be
        serialized. This is also true when the DOM Level 1 method
        <code>Document.createEntityReference(name)</code> is used to create
	entity references that correspond to such
        entities, since the <termref def="dt-descendant">descendants</termref>
        of the returned <code>EntityReference</code> are unbound. While DOM Level
        3 does have support for the resolution of namespace prefixes,
        use of such entities and entity references should be
        avoided or used with extreme care.</p>
      <p>The "NS" methods, such as
	<code>Document.createElementNS(namespaceURI, qualifiedName)</code> and
        <code>Document.createAttributeNS(namespaceURI, qualifiedName)</code>,
        are meant to be used by namespace aware applications. Simple
        applications that do not use namespaces can use the DOM Level 1
        methods, such as <code>Document.createElement(tagName)</code> and
        <code>Document.createAttribute(name)</code>. Elements and attributes created in this
        way do not have any namespace prefix, namespace URI, or local name.</p>
      <note>
        <p>DOM Level 1 methods are namespace ignorant. Therefore, while it is
          safe to use these methods when not dealing with namespaces, using
          them and the new ones at the same time should be avoided. DOM Level 1
          methods solely identify attribute nodes by their
          <code>Node.nodeName</code>. On the contrary, the DOM Level 2 methods
          related to namespaces, identify attribute nodes by their
          <code>Node.namespaceURI</code> and <code>Node.localName</code>. Because of this
          fundamental difference, mixing both sets of methods can lead to
          unpredictable results. In particular, using
          <code>Element.setAttributeNS(namespaceURI, qualifiedName, value)</code>, an
          <termref def="dt-element">element</termref> may have two attributes
          (or more) that have the same <code>Node.nodeName</code>, but different
          <code>Node.namespaceURI</code>s. Calling <code>Element.getAttribute(name)</code> with
          that <code>nodeName</code> could then return any of those
          attributes. The result depends on the implementation. Similarly,
          using <code>Element.setAttributeNode(newAttr)</code>, one can set two attributes (or
          more) that have different <code>Node.nodeName</code>s but the same
          <code>Node.prefix</code> and <code>Node.namespaceURI</code>. In this case
          <code>Element.getAttributeNodeNS(namespaceURI, localName)</code> will return either attribute, in an
          implementation dependent manner. The only guarantee in such cases is
          that all methods that access a named item by its
          <code>nodeName</code> will access the same item, and all methods
          which access a node by its URI and local name will access the same
          node. For instance, <code>Element.setAttribute(name, value)</code> and
          <code>Element.setAttributeNS(namespaceURI, qualifiedName, value)</code> affect the node that
          <code>Element.getAttribute(name)</code> and
	  <code>Element.getAttributeNS(namespaceURI, localName)</code>,
          respectively, return.</p>
      </note>
    </div3>

    <div3 id="baseURIs-Considerations">
      <head>Base URIs</head>

      <p>The DOM Level 3 adds support for the <b>[base URI]</b> property
	defined in
        <bibref ref="InfoSet"/> by providing a new attribute on the
        <code>Node</code> interface that exposes this information. However,
        unlike the <code>Node.namespaceURI</code> attribute, the
        <code>Node.baseURI</code> attribute is not a static piece of information
        that every node carries. Instead, it is a value that is dynamically
        computed according to <bibref ref="XMLBase"/>. This means its value
        depends on the location of the node in the tree and moving the node
        from one place to another in the tree may affect its value. Other
        changes, such as adding or changing an <code>xml:base</code> attribute on the node
        being queried or one of its ancestors may also affect its value.
      </p>

      <p>One consequence of this it that when external entity references are
        expanded while building a <code>Document</code> one may need to add, or
        change, an xml:base attribute to the
        <code>Element</code> nodes originally contained in the entity being
        expanded so that the <code>Node.baseURI</code> returns the correct value. In
        the case of <code>ProcessingInstruction</code> nodes originally
        contained in the entity being expanded the information is lost.
        <bibref role="informative" ref="DOMLS"/> handles elements as described
        here and generates a warning in the latter case.
      </p>

    </div3>

    <div3 id="Embedded-DOM">
      <head>Mixed DOM implementations</head>

      <p>As new XML vocabularies are developed, those defining the vocabularies
	are also beginning to define specialized APIs for manipulating XML
	instances of those vocabularies. This is usually done by extending the
	DOM to provide interfaces and methods that perform operations
	frequently needed by their users. For example, the MathML <bibref role="informative" ref="MathML2"/> and SVG
	<bibref role="informative" ref="SVG1"/> specifications have developed DOM extensions to allow users to
	manipulate instances of these vocabularies using semantics appropriate
	to images and mathematics, respectively, as well as the generic DOM XML
	semantics. Instances of SVG or MathML are often embedded in XML
	documents conforming to a different schema such as XHTML.
      </p>

      <p>
	While the Namespaces in XML specification <bibref ref="Namespaces"/> provides a mechanism for integrating these
	documents at the syntax level, it has become clear that the DOM
	Level 2 Recommendation <bibref role="informative" ref="DOM2Core"/> is not rich enough to cover all the issues that
	have been encountered in having these different DOM
	implementations be used together in a single application. DOM
	Level 3 deals with the requirements brought about by embedding
	fragments written according to a specific markup language (the
	embedded component) in a document where the rest of the markup
	is not written according to that specific markup language (the
	host document). It does not deal with fragments embedded by
	reference or linking.</p>

      <p>A DOM implementation supporting DOM Level 3 Core should be able to
	collaborate with subcomponents implementing specific DOMs to assemble a
	compound document that can be traversed and manipulated via DOM
	interfaces as if it were a seamless whole.</p>

      <p>The normal typecast operation on an object should support the
	interfaces expected by legacy code for a given document type.
	Typecasting techniques may not be adequate for selecting between
	multiple DOM specializations of an object which were combined at run
	time, because they may not all be part of the same object as defined by
	the binding's object model. Conflicts are most obvious with the
	<code>Document</code> object, since it is shared as owner by the rest
	of the document. In a homogeneous document, elements rely on the
	Document for specialized services and construction of specialized
	nodes. In a heterogeneous document, elements from different modules
	expect different services and APIs from the same <code>Document</code>
	object, since there can only be one owner and root of the document
	hierarchy.</p>
    </div3>

    <div3 id="DOMFeatures">
      <head>DOM Features</head>

      <p>
	Each DOM module defines one or more features, as listed in the
	conformance section (<specref ref="ID-Conformance"/>). Features
	are case-insensitive and are also defined for a specific set of
	versions. For example, this specification defines the features
	<code>"Core"</code> and <code>"XML"</code>, for the
	version <code>"3.0"</code>.  Versions <code>"1.0"</code> and
	<code>"2.0"</code> can also be used for features defined in the corresponding DOM
	Levels.  To avoid possible conflicts, as a convention, names
	referring to features defined outside the DOM specification
	should be made unique. Applications could then request for
	features to be supported by a DOM implementation using the
	methods
	<code>DOMImplementationSource.getDOMImplementation(features)</code>
	or
	<code>DOMImplementationSource.getDOMImplementationList(features)</code>,
	check the features supported by a DOM implementation using the
	method <code>DOMImplementation.hasFeature(feature, version)</code>, or by a specific node using
	<code>Node.isSupported(feature, version)</code>. Note that when
	using the methods that take a feature and a version as
	parameters, applications can use <code>null</code> or empty
	string for the version parameter if they don't wish to specify a
	particular version for the specified feature.
      </p>
      <p>
	Up to the DOM Level 2 modules, all interfaces, that were an
	extension of existing ones, were accessible using
	binding-specific casting mechanisms if the feature associated to
	the extension was supported. For example, an instance of the
	<code>EventTarget</code> interface could be obtained from an
	instance of the <code>Node</code> interface if the feature
	"Events" was supported by the node.
      </p>
      <p>
	As discussed <specref ref="Embedded-DOM"/>, DOM Level 3 Core
	should be able to collaborate with subcomponents implementing
	specific DOMs. For that effect, the methods
	<code>DOMImplementation.getFeature(feature, version)</code> and
	<code>Node.getFeature(feature, version)</code> were
	introduced. In the case of
	<code>DOMImplementation.hasFeature(feature, version)</code> and
	<code>Node.isSupported(feature, version)</code>, if a plus sign
	"+" is prepended to any feature name, implementations are
	considered in which the specified feature may not be directly
	castable but would require discovery through
	<code>DOMImplementation.getFeature(feature, version)</code> and
	<code>Node.getFeature(feature, version)</code>. Without a plus,
	only features whose interfaces are directly castable are
	considered.
      </p>
      <eg role="code" xml:space="preserve">// example 1, without prepending the "+"
if (myNode.isSupported("Events", "3.0")) {
    EventTarget evt = (EventTarget) myNode;
    // ...
}
// example 2, with the "+"
if (myNode.isSupported("+Events", "3.0")) {
    // (the plus sign "+" is irrelevant for the getFeature method itself
    // and is ignored by this method anyway)
    EventTarget evt = (EventTarget) myNode.getFeature("Events", "3.0");
    // ...
}</eg>
    </div3>

    <div3 id="Bootstrap">
      <head>Bootstrapping</head>

      <p>Because previous versions of the DOM specification only defined a set
        of interfaces, applications had to rely on some implementation
        dependent code to start from. However, hard-coding the application to a
        specific implementation prevents the application from running on other
        implementations and from using the most-suitable implementation of the
        environment. At the same time, implementations may also need to load
        modules or perform other setup to efficiently adapt to different and
        sometimes mutually-exclusive feature sets.</p>

      <p>To solve these problems this specification introduces a
        <code>DOMImplementationRegistry</code> object with a function that lets
        an application find implementations, based on the specific features
        it requires. How this object is found and what it exactly looks like is
        not defined here, because this cannot be done in a language-independent
        manner. Instead, each language binding defines its own way of doing
        this. See <specref ref="java-binding"/> and
          <specref ref="ecma-binding"/> for specifics.</p>

      <p>In all cases, though, the <code>DOMImplementationRegistry</code>
        provides a <code>getDOMImplementation</code> method accepting a
        features string, which is passed to every known
        <code>DOMImplementationSource</code> until a suitable
        <code>DOMImplementation</code> is found and returned.
	The <code>DOMImplementationRegistry</code>
        also provides a <code>getDOMImplementationList</code> method accepting a
        features string, which is passed to every known
        <code>DOMImplementationSource</code>, and returns a list of suitable
        <code>DOMImplementations</code>. Those two methods are
        the same as the ones found on the <code>DOMImplementationSource</code>
        interface. </p>

      <p>Any number of <code>DOMImplementationSource</code> objects can be
        registered. A source may return one or more
        <code>DOMImplementation</code> singletons or construct new
        <code>DOMImplementation</code> objects, depending upon whether the
        requested features require specialized state in the
        <code>DOMImplementation</code> object.</p>

    </div3>

  </div2>
  <!--
  ******************************************************
  | DOCUMENT OBJECT MODEL APIs                         |
  ******************************************************
  -->
  <div2 id="ID-BBACDC08">
    <head>Fundamental Interfaces: Core module</head>

    <p>The interfaces within this section are considered
      <emph>fundamental</emph>, and must be fully implemented by all conforming
      implementations of the DOM, including all HTML DOM implementations
      <bibref role="informative" ref="DOM2HTML"/>, unless otherwise specified.
    </p>
    <p>A DOM application may use the
    <code>DOMImplementation.hasFeature(feature, version)</code> method
    with parameter values "Core" and "3.0" (respectively) to determine
    whether or not this module is supported by the implementation. Any
    implementation that conforms to DOM Level 3 or a DOM Level 3 module
    must conform to the Core module. Please refer to additional
    information about <xspecref xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/TR/DOM-Level-3-Core/introduction.html#ID-Conformance" xlink:type="simple" xlink:show="new" xlink:actuate="onRequest">conformance</xspecref> in this specification.  The DOM Level 3 Core
    module is backward compatible with the DOM Level 2 Core <bibref role="informative" ref="DOM2Core"/> module, i.e. a DOM Level 3 Core
    implementation who returns <code>true</code> for "Core" with the
    <code>version</code> number <code>"3.0"</code> must also return
    <code>true</code> for this <code>feature</code> when the
    <code>version</code> number is <code>"2.0"</code>, <code>""</code>
    or, <code>null</code>.
    </p>

    <definitions>
      
<!-- $Date: 2004/02/04 22:41:13 $ $Revision: 1.5 $ -->
<!--[ Exceptions description ]-->
<exception name="DOMException" id="ID-17189187">
  <descr>
    <p>DOM operations only raise exceptions in "exceptional"
      circumstances, i.e., when an operation is impossible to perform (either
      for logical reasons, because data is lost, or because the implementation
      has become unstable). In general, DOM methods return specific error
      values in ordinary processing situations, such as out-of-bound errors
      when using <code>NodeList</code>.</p>
    <p>Implementations should raise other exceptions under other circumstances.
      For example, implementations should raise an implementation-dependent 
      exception if a <code>null</code> argument is passed when
      <code>null</code> was not expected.</p>
    <p>Some languages and object systems do not support the concept of
      exceptions. For such systems, error conditions may be indicated using
      native error reporting mechanisms. For some bindings, for example,
      methods may return error codes similar to those listed in the
      corresponding method descriptions.</p>
  </descr>
  <component id="ID-146F692A" name="code">
    <typename>unsigned short</typename>
  </component>
</exception>
<group id="ID-258A00AF" name="ExceptionCode">
  <descr>
    <p>An integer indicating the type of error generated.</p>
    <note>
      <p>Other numeric codes are reserved for W3C for possible future use.</p>
    </note>
  </descr>
  <constant id="DOMException-INDEX_SIZE_ERR" name="INDEX_SIZE_ERR" type="unsigned short" value="1">
    <descr>
      <p>If index or size is negative, or greater than the allowed value.</p>
    </descr>
  </constant>
  <constant id="DOMException-DOMSTRING_SIZE_ERR" name="DOMSTRING_SIZE_ERR" type="unsigned short" value="2">
    <descr>
      <p>If the specified range of text does not fit into a <code>DOMString</code>.</p>
    </descr>
  </constant>
  <constant id="DOMException-HIERARCHY_REQUEST_ERR" name="HIERARCHY_REQUEST_ERR" type="unsigned short" value="3">
    <descr>
      <p>If any <code>Node</code> is inserted somewhere it doesn't belong.</p>
    </descr>
  </constant>
  <constant id="DOMException-WRONG_DOCUMENT_ERR" name="WRONG_DOCUMENT_ERR" type="unsigned short" value="4">
    <descr>
      <p>If a <code>Node</code> is used in a different document than the one that created it
        (that doesn't support it).</p>
    </descr>
  </constant>
  <constant id="DOMException-INVALID_CHARACTER_ERR" name="INVALID_CHARACTER_ERR" type="unsigned short" value="5">
    <descr>
      <p>If an invalid or illegal character is specified, such as in a
        name.<!-- See <xspecref href="&xml-spec;#NT-Char">production 2</xspecref>
        in the XML specification for the definition of a legal character, and 
        <xspecref href="&xml-spec;#NT-Name">production 5</xspecref> for the
        definition of a legal name character.--></p>
    </descr>
  </constant>
  <constant id="DOMException-NO_DATA_ALLOWED_ERR" name="NO_DATA_ALLOWED_ERR" type="unsigned short" value="6">
    <descr>
      <p>If data is specified for a <code>Node</code> which does not support data.</p>
    </descr>
  </constant>
  <constant id="DOMException-NO_MODIFICATION_ALLOWED_ERR" name="NO_MODIFICATION_ALLOWED_ERR" type="unsigned short" value="7">
    <descr>
      <p>If an attempt is made to modify an object where modifications are not
        allowed.</p>
    </descr>
  </constant>
  <constant id="DOMException-NOT_FOUND_ERR" name="NOT_FOUND_ERR" type="unsigned short" value="8">
    <descr>
      <p>If an attempt is made to reference a <code>Node</code> in a context where it does
        not exist.</p>
    </descr>
  </constant>
  <constant id="DOMException-NOT_SUPPORTED_ERR" name="NOT_SUPPORTED_ERR" type="unsigned short" value="9">
    <descr>
      <p>If the implementation does not support the requested type of object or
        operation.</p>
    </descr>
  </constant>
  <constant id="DOMException-INUSE_ATTRIBUTE_ERR" name="INUSE_ATTRIBUTE_ERR" type="unsigned short" value="10">
    <descr>
      <p>If an attempt is made to add an attribute that is already in use
	elsewhere.</p>
    </descr>
  </constant>
  <!-- ****** DOM Level 2 additions ****** -->
  <constant id="DOMException-INVALID_STATE_ERR" name="INVALID_STATE_ERR" type="unsigned short" value="11" since="DOM Level 2">
    <descr>
      <p>If an attempt is made to use an object that is not, or is no longer,
        usable.</p>
    </descr>
  </constant>
  <constant id="DOMException-SYNTAX_ERR" name="SYNTAX_ERR" type="unsigned short" value="12" since="DOM Level 2">
    <descr>
      <p>If an invalid or illegal string is specified.</p>
    </descr>
  </constant>
  <constant id="DOMException-INVALID_MODIFICATION_ERR" name="INVALID_MODIFICATION_ERR" type="unsigned short" value="13" since="DOM Level 2">
    <descr>
      <p>If an attempt is made to modify the type of the underlying object.</p>
    </descr>
  </constant>
  <constant id="DOMException-NAMESPACE_ERR" name="NAMESPACE_ERR" type="unsigned short" value="14" since="DOM Level 2">
    <descr>
      <p>If an attempt is made to create or change an object in a way which is
        incorrect with regard to namespaces.</p>
    </descr>
  </constant>
  <constant id="DOMException-INVALID_ACCESS_ERR" name="INVALID_ACCESS_ERR" type="unsigned short" value="15" since="DOM Level 2">
    <descr>
      <p>If a parameter or an operation is not supported by the underlying
        object.</p>
    </descr>
  </constant>
  <constant id="DOMException-VALIDATION_ERR" name="VALIDATION_ERR" type="unsigned short" value="16" since="DOM Level 3">
    <descr>
      <p>If a call to a method such as <code>insertBefore</code> or
      <code>removeChild</code> would make the <code>Node</code> invalid with
      respect to <termref def="dt-partially-valid">"partial
      validity"</termref>, this exception would be raised and the operation
      would not be done. This code is used in <bibref role="informative" ref="DOMVal"/>. Refer to this specification for further information.</p>
    </descr>
  </constant>
  <constant id="DOMException-TYPE_MISMATCH_ERR" name="TYPE_MISMATCH_ERR" type="unsigned short" value="17" since="DOM Level 3">
    <descr>
      <p>
	If the type of an object is incompatible with the expected type
	of the parameter associated to the object.
      </p>
    </descr>
  </constant>
</group>
 
<!-- $Date: 2004/02/04 22:41:13 $ -->
<!--[ NameList object description ]-->
<interface name="DOMStringList" id="DOMStringList" since="DOM Level 3">
  <descr>
    <p>
      The <code>DOMStringList</code> interface provides the abstraction
      of an ordered collection of <code>DOMString</code> values, without
      defining or constraining how this collection is implemented. The
      items in the <code>DOMStringList</code> are accessible via an
      integral index, starting from 0.
    </p>
  </descr>

  <method name="item" id="DOMStringList-item">
    <descr>
      <p>
	Returns the <code>index</code>th item in the collection. If
	<code>index</code> is greater than or equal to the number of
	<code>DOMString</code>s in the list, this returns
	<code>null</code>.
      </p>
    </descr>
    <parameters>
      <param name="index" type="unsigned long" attr="in">
	<descr>
          <p>Index into the collection.</p>
        </descr>
      </param>
    </parameters>
    <returns type="DOMString">
      <descr>
        <p>
	  The <code>DOMString</code> at the <code>index</code>th
	  position in the <code>DOMStringList</code>, or
	  <code>null</code> if that is not a valid index.
	</p>
      </descr>
    </returns>
    <raises>
      <!-- No exceptions -->
    </raises>
  </method>

  <attribute type="unsigned long" readonly="yes" name="length" id="DOMStringList-length">
    <descr>
      <p>The number of <code>DOMString</code>s in the list. The range of
      valid child node indices is 0 to <code>length-1</code>
      inclusive.</p>
    </descr>
  </attribute>

  <method name="contains" id="DOMStringList-contains">
    <descr>
      <p>
	Test if a string is part of this <code>DOMStringList</code>.
      </p>
    </descr>
    <parameters>
      <param name="str" type="DOMString" attr="in">
	<descr>
	  <p>
	    The string to look for.
	  </p>
	</descr>
      </param>
    </parameters>
    <returns type="boolean">
      <descr>
	<p>
	  <code>true</code> if the string has been found,
	  <code>false</code> otherwise.
	</p>
      </descr>
    </returns>
    <raises>
    </raises>
  </method>

</interface>
      
 
<!-- $Date: 2004/02/04 22:41:13 $ -->
<!--[ NameList object description ]-->
<interface name="NameList" id="NameList" since="DOM Level 3">
  <descr>
    <p>
      The <code>NameList</code> interface provides the abstraction of an
      ordered collection of parallel pairs of name and namespace values
      (which could be null values), without defining or constraining how
      this collection is implemented. The items in the
      <code>NameList</code> are accessible via an integral index,
      starting from 0.
    </p>
  </descr>

  <method name="getName" id="NameList-getName">
    <descr>
      <p>
	Returns the <code>index</code>th name item in the collection.
      </p>
    </descr>
    <parameters>
      <param name="index" type="unsigned long" attr="in">
	<descr>
          <p>Index into the collection.</p>
        </descr>
      </param>
    </parameters>
    <returns type="DOMString">
      <descr>
        <p>
	  The name at the <code>index</code>th
	  position in the <code>NameList</code>, or <code>null</code> if
	  there is no name for the specified index or if the index is
	  out of range.
	</p>
      </descr>
    </returns>
    <raises>
    </raises>
  </method>

  <method name="getNamespaceURI" id="NameList-getNamespaceURI">
    <descr>
      <p>
	Returns the <code>index</code>th namespaceURI item in the
	collection.
      </p>
    </descr>
    <parameters>
      <param name="index" type="unsigned long" attr="in">
	<descr>
          <p>Index into the collection.</p>
        </descr>
      </param>
    </parameters>
    <returns type="DOMString">
      <descr>
        <p>
	  The namespace URI at the <code>index</code>th
	  position in the <code>NameList</code>, or <code>null</code> if
	  there is no name for the specified index or if the index is
	  out of range.
	</p>
      </descr>
    </returns>
    <raises>
    </raises>
  </method>

  <attribute type="unsigned long" readonly="yes" name="length" id="NameList-length">
    <descr>
      <p>
	The number of pairs (name and namespaceURI) in the list. The
	range of valid child node indices is 0 to <code>length-1</code>
	inclusive.
      </p>
    </descr>
  </attribute>

  <method name="contains" id="NameList-contains">
    <descr>
      <p>
	Test if a name is part of this <code>NameList</code>.
      </p>
    </descr>
    <parameters>
      <param name="str" type="DOMString" attr="in">
	<descr>
	  <p>
	    The name to look for.
	  </p>
	</descr>
      </param>
    </parameters>
    <returns type="boolean">
      <descr>
	<p>
	  <code>true</code> if the name has been found,
	  <code>false</code> otherwise.
	</p>
      </descr>
    </returns>
    <raises>
    </raises>
  </method>

  <method name="containsNS" id="NameList-containsNS">
    <descr>
      <p>
	Test if the pair namespaceURI/name is part of this
	<code>NameList</code>.
      </p>
    </descr>
    <parameters>
      <param name="namespaceURI" type="DOMString" attr="in">
	<descr>
	  <p>
	    The namespace URI to look for.
	  </p>
	</descr>
      </param>
      <param name="name" type="DOMString" attr="in">
	<descr>
	  <p>
	    The name to look for.
	  </p>
	</descr>
      </param>
    </parameters>
    <returns type="boolean">
      <descr>
	<p>
	  <code>true</code> if the pair namespaceURI/name has been
	  found, <code>false</code> otherwise.
	</p>
      </descr>
    </returns>
    <raises>
    </raises>
  </method>

</interface>
      

      
<!-- $Date: 2004/02/04 22:41:13 $ -->
<!--[ NameList object description ]-->
<interface name="DOMImplementationList" id="DOMImplementationList" since="DOM Level 3">
  <descr>
    <p>
      The <code>DOMImplementationList</code> interface provides the
      abstraction of an ordered collection of DOM implementations,
      without defining or constraining how this collection is
      implemented. The items in the <code>DOMImplementationList</code>
      are accessible via an integral index, starting from 0.
    </p>
  </descr>

  <method name="item" id="DOMImplementationList-item">
    <descr>
      <p>
	Returns the <code>index</code>th item in the collection. If
	<code>index</code> is greater than or equal to the number of
	<code>DOMImplementation</code>s in the list, this returns
	<code>null</code>.
      </p>
    </descr>
    <parameters>
      <param name="index" type="unsigned long" attr="in">
	<descr>
          <p>Index into the collection.</p>
        </descr>
      </param>
    </parameters>
    <returns type="DOMImplementation">
      <descr>
        <p>
	  The <code>DOMImplementation</code> at the <code>index</code>th
	  position in the <code>DOMImplementationList</code>, or
	  <code>null</code> if that is not a valid index.
	</p>
      </descr>
    </returns>
    <raises>
      <!-- No exceptions -->
    </raises>
  </method>

  <attribute type="unsigned long" readonly="yes" name="length" id="DOMImplementationList-length">
    <descr>
      <p>
	The number of <code>DOMImplementation</code>s in the list. The
	range of valid child node indices is 0 to <code>length-1</code>
	inclusive.
      </p>
    </descr>
  </attribute>
</interface>
      
 
<!-- $Id: xml-source.xml,v 1.5 2004/02/04 22:41:13 plehegar Exp $ -->
<interface name="DOMImplementationSource" id="DOMImplementationSource" since="DOM Level 3">
  <descr>
    <p>This interface permits a DOM implementer to supply one or more
      implementations, based upon requested features and versions, as
      specified in <specref ref="DOMFeatures"/>. Each implemented
      <code>DOMImplementationSource</code> object is listed in the
      binding-specific list of available sources so that its
      <code>DOMImplementation</code> objects are made available.</p>
  </descr>
  <method name="getDOMImplementation" id="ID-getDOMImpl">
    <descr>
      <p>
	A method to request the first DOM implementation that supports the
	specified features.
      </p>
    </descr>
    <parameters>
      <param name="features" type="DOMString" attr="in">
        <descr>
          <p>
	    A string that specifies which features and versions are
	    required. This is a space separated list in which each
	    feature is specified by its name optionally followed by a
	    space and a version number.
	  </p>
	  <p>
	    This method returns the first item of the list returned by
	    <code>getDOMImplementationList</code>.
	  </p>
	  <p>
	    As an example, the string <code>"XML 3.0 Traversal +Events
	    2.0"</code> will request a DOM implementation that supports
	    the module "XML" for its 3.0 version, a module that support
	    of the "Traversal" module for any version, and the module
	    "Events" for its 2.0 version. The module "Events" must be
	    accessible using the method <code>Node.getFeature()</code> and
	    <code>DOMImplementation.getFeature()</code>.
	  </p>
        </descr>
      </param>
    </parameters>
    <returns type="DOMImplementation">
      <descr>
        <p>The first DOM implementation that support the desired features, or
          <code>null</code> if this source has none.</p>
      </descr>
    </returns>
    <raises>
      <!-- Throws no exceptions -->
    </raises>
  </method>

  <method name="getDOMImplementationList" id="ID-getDOMImpls">
    <descr>
      <p>A method to request a list of DOM implementations that support
      the specified features and versions, as specified in <specref ref="DOMFeatures"/>.</p>
    </descr>
    <parameters>
      <param name="features" type="DOMString" attr="in">
        <descr>
          <p>A string that specifies which features and versions are
          required. This is a space separated list in which each feature
          is specified by its name optionally followed by a space and a
          version number. This is something like: "XML 3.0 Traversal
          +Events 2.0"</p>
        </descr>
      </param>
    </parameters>
    <returns type="DOMImplementationList">
      <descr>
        <p>A list of DOM implementations that support the desired
        features.</p>
      </descr>
    </returns>
    <raises>
      <!-- Throws no exceptions -->
    </raises>
  </method>
</interface>

      
<!--[ DOMImplementation object description ]-->    
<!-- $Date: 2004/02/04 22:41:13 $ $Revision: 1.5 $ -->
<interface name="DOMImplementation" id="ID-102161490">
  <descr>
    <p>The <code>DOMImplementation</code> interface provides a number of
      methods for performing operations that are independent of any particular
      instance of the document object model.</p>
  </descr>
  <method name="hasFeature" id="ID-5CED94D7">
    <descr>
      <p>Test if the DOM implementation implements a specific feature
      and version, as specified in <specref ref="DOMFeatures"/>.</p>
    </descr>
    <parameters>
      <param name="feature" type="DOMString" attr="in">
	<descr>
          <p>
	    The name of the feature to test.
	  </p>
        </descr>
      </param>
      <param name="version" type="DOMString" attr="in">
	<descr>
          <p>
	    This is the version number of the feature to test.
	  </p>
        </descr>
      </param>
    </parameters>
    <returns type="boolean">
      <descr>
        <p><code>true</code> if the feature is implemented in the specified
          version, <code>false</code> otherwise.</p>
      </descr>
    </returns>
    <raises>
      <!-- Throws no exceptions -->
    </raises>
  </method>

  <!-- ****** DOM Level 2 additions ****** -->
  <method name="createDocumentType" id="Level-2-Core-DOM-createDocType" since="DOM Level 2">
    <descr>
      <p>Creates an empty <code>DocumentType</code> node. Entity declarations
        and notations are not made available. Entity reference expansions and
        default attribute additions do not occur.<!-- It is expected that a future
        version of the DOM will provide a way for populating a
        <code>DocumentType</code> -->.</p>
    </descr>
    <parameters>
      <param name="qualifiedName" type="DOMString" attr="in">
	<descr>
          <p>The <termref def="dt-qualifiedname">qualified name</termref>
	    of the document type to be created.</p>
	</descr>
      </param>
      <param name="publicId" type="DOMString" attr="in">
	<descr>
          <p>The external subset public identifier.</p>
	</descr>
      </param>
      <param name="systemId" type="DOMString" attr="in">
	<descr>
          <p>The external subset system identifier.</p>
	</descr>
      </param>
    </parameters>
    <returns type="DocumentType">
      <descr>
        <p>A new <code>DocumentType</code> node with
          <code>Node.ownerDocument</code> set to <code>null</code>.</p>
      </descr>
    </returns>
    <raises>
      <exception name="DOMException">
	<descr>
          <p>INVALID_CHARACTER_ERR: Raised if the specified qualified name
	    contains an illegal character according to <bibref ref="XML"/>.</p>
	  <p>NAMESPACE_ERR: Raised if the <code>qualifiedName</code> is
	    malformed.</p>
          <p>NOT_SUPPORTED_ERR: May be raised if the implementation does
	    not support the feature "XML" and the language exposed
	    through the Document does not support XML Namespaces (such
	    as <bibref role="informative" ref="HTML40"/>).
          </p>
	</descr>
      </exception>
    </raises>
  </method>

  <method name="createDocument" id="Level-2-Core-DOM-createDocument" since="DOM Level 2">
    <descr>
      <p>Creates a DOM Document object of the specified type with its document
        element.</p>
      <p>Note that based on the <code>DocumentType</code> given to create the
        document, the implementation may instantiate specialized
        <code>Document</code> objects that support additional features than the
        "Core", such as "HTML" <bibref role="informative" ref="DOM2HTML"/>.
        On the other hand, setting the <code>DocumentType</code> after the
        document was created makes this very unlikely to happen. Alternatively,
        specialized <code>Document</code> creation methods, such as
        <code>createHTMLDocument</code>
        <bibref role="informative" ref="DOM2HTML"/>, can be used to obtain
        specific types of <code>Document</code> objects.</p>
    </descr>
    <parameters>
      <param name="namespaceURI" type="DOMString" attr="in">
	<descr>
          <p>The <termref def="dt-namespaceURI">namespace URI</termref> of the
            document element to create or <code>null</code>.</p>
	</descr>
      </param>
      <param name="qualifiedName" type="DOMString" attr="in">
	<descr>
          <p>The <termref def="dt-qualifiedname">qualified name</termref> of
            the document element to be created or <code>null</code>.</p>
	</descr>
      </param>
      <param name="doctype" type="DocumentType" attr="in">
	<descr>
          <p>The type of document to be created or <code>null</code>.</p>
	  <p>When <code>doctype</code> is not <code>null</code>, its
	    <code>Node.ownerDocument</code> attribute is set to the document
	    being created.</p>
	</descr>
      </param>
    </parameters>
    <returns type="Document">
      <descr>
        <p>A new <code>Document</code> object with its document element. If the
	  <code>NamespaceURI</code>, <code>qualifiedName</code>, and
	  <code>doctype</code> are <code>null</code>, the returned
	  <code>Document</code> is empty with no document element.</p>
      </descr>
    </returns>
    <raises>
      <exception name="DOMException">
	<descr>
          <p>INVALID_CHARACTER_ERR: Raised if the specified qualified name
	    contains an illegal character according to <bibref ref="XML"/>.</p>
	  <p>NAMESPACE_ERR: Raised if the <code>qualifiedName</code> is
            malformed, if the <code>qualifiedName</code> has a prefix and the
            <code>namespaceURI</code> is <code>null</code>, or if the
	    <code>qualifiedName</code> is <code>null</code> and the
            <code>namespaceURI</code> is different from <code>null</code>, or if the
            <code>qualifiedName</code> has a prefix that is "xml" and the
            <code>namespaceURI</code> is different from
            "<loc xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.w3.org/XML/1998/namespace" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">http://www.w3.org/XML/1998/namespace</loc>" <bibref ref="Namespaces"/>,
              or if the DOM implementation does not support the
              <code>"XML"</code> feature but a non-null namespace URI was
              provided, since namespaces were defined by XML.</p>
	  <p>WRONG_DOCUMENT_ERR: Raised if <code>doctype</code> has already
	    been used with a different document or was created from a different
            implementation.</p>

          <p>NOT_SUPPORTED_ERR: May be raised if the implementation does
	    not support the feature "XML" and the language exposed
	    through the Document does not support XML Namespaces (such
	    as <bibref role="informative" ref="HTML40"/>).
          </p>
	</descr>
      </exception>
    </raises>
  </method>

  <!-- ****** DOM Level 3 additions ****** -->
  <method name="getFeature" id="DOMImplementation3-getFeature" since="DOM Level 3">
    <descr>
      <p>
	This method returns a specialized object which implements the
	specialized APIs of the specified feature and version, as
	specified in <specref ref="DOMFeatures"/>. The specialized
	object may also be obtained by using binding-specific casting
	methods but is not necessarily expected to, as discussed in
	<specref ref="Embedded-DOM"/>. This method also allow the
	implementation to provide specialized objects which do not
	support the <code>DOMImplementation</code> interface.
      </p>
    </descr>
    <parameters>
      <param name="feature" type="DOMString" attr="in">
        <descr>
          <p>
	    The name of the feature requested. Note that any plus sign
	    "+" prepended to the name of the feature will be ignored
	    since it is not significant in the context of this method.
	  </p>
        </descr>
      </param>
      <param name="version" type="DOMString" attr="in">
        <descr>
          <p>
	    This is the version number of the feature to test.
	  </p>
        </descr>
      </param>
    </parameters>
    <returns type="DOMObject">
      <descr>
        <p>
	  Returns an object which implements the specialized APIs of the
	  specified feature and version, if any, or <code>null</code> if
	  there is no object which implements interfaces associated with
	  that feature. If the <code>DOMObject</code> returned by this
	  method implements the <code>DOMImplementation</code>
	  interface, it must delegate to the primary core
	  <code>DOMImplementation</code> and not return results
	  inconsistent with the primary core
	  <code>DOMImplementation</code> such as
	  <code>hasFeature</code>, <code>getFeature</code>, etc.
	</p>
      </descr>
    </returns>
    <raises>
    </raises>
  </method>
</interface>
 
<!--[ DocumentFragment object description ]-->    
<!-- $Date: 2004/02/04 22:41:13 $ $Revision: 1.5 $ -->
<interface name="DocumentFragment" inherits="Node" id="ID-B63ED1A3">
  <descr>
    <p><code>DocumentFragment</code> is a "lightweight" or "minimal"
      <code>Document</code> object. It is very common to want to be able to
      extract a portion of a document's tree or to create a new fragment of a
      document. Imagine implementing a user command like cut or rearranging a
      document by moving fragments around. It is desirable to have an object
      which can hold such fragments and it is quite natural to use a Node for
      this purpose. While it is true that a <code>Document</code> object could
      fulfill this role, a <code>Document</code> object can potentially be a
      heavyweight object, depending on the underlying implementation. What is
      really needed for this is a very lightweight
      object. <code>DocumentFragment</code> is such an object.</p>
    <p>Furthermore, various operations -- such as inserting nodes as children
      of another <code>Node</code> -- may take <code>DocumentFragment</code>
      objects as arguments;  this results in all the child nodes of the
      <code>DocumentFragment</code> being moved to the child list of this
      node.</p>
    <p>The children of a <code>DocumentFragment</code> node are zero or more
      nodes representing the tops of any sub-trees defining the structure of
      the document. <code>DocumentFragment</code> nodes do not need to be
      <termref def="dt-well-formed">well-formed XML documents</termref>
      (although they do need to follow the rules imposed upon well-formed XML
      parsed entities, which can have multiple top nodes). For example, a
      <code>DocumentFragment</code> might have only one child and that child
      node could be a <code>Text</code> node. Such a structure model represents
      neither an HTML document nor a well-formed XML document.</p>
    <p>When a <code>DocumentFragment</code> is inserted into a
      <code>Document</code> (or indeed any other <code>Node</code> that may
      take children) the children of the <code>DocumentFragment</code> and not
      the <code>DocumentFragment</code> itself are inserted into the
      <code>Node</code>. This makes the <code>DocumentFragment</code> very
      useful when the user wishes to create nodes that are
      <termref def="dt-sibling">siblings</termref>; the
      <code>DocumentFragment</code> acts as the parent of these nodes so that
      the user can use the standard methods from the <code>Node</code>
      interface, such as <code>Node.insertBefore</code> and
      <code>Node.appendChild</code>.</p>
  </descr> 
</interface>

<!--[ Document object description ]-->    
<interface name="Document" inherits="Node" id="i-Document">
  <descr>
    <p>The <code>Document</code> interface represents the entire HTML or XML
      document. Conceptually, it is the
      <termref def="dt-root-node">root</termref> of the document tree, and
      provides the primary access to the document's data.</p>
    <p>Since elements, text nodes, comments, processing instructions,
      etc. cannot exist outside the context of a <code>Document</code>, the
      <code>Document</code> interface also contains the factory methods needed
      to create these objects. The <code>Node</code> objects created have a
      <code>ownerDocument</code> attribute which associates them with the
      <code>Document</code> within whose context they were created.</p>
  </descr>

  <attribute id="ID-B63ED1A31" name="doctype" type="DocumentType" readonly="yes" version="DOM Level 3">
    <descr>
      <p>The Document Type Declaration (see <code>DocumentType</code>)
        associated with this document. For XML
        documents without a document type declaration this returns
        <code>null</code>. For HTML documents, a
	<code>DocumentType</code> object may be returned, independently
	of the presence or absence of document type declaration in the
	HTML document.</p>
      <p>This provides direct access to the <code>DocumentType</code> node,
        child node of this <code>Document</code>. This node can be set at
        document creation time and later changed through the use of child nodes
        manipulation methods, such as <code>Node.insertBefore</code>, or
        <code>Node.replaceChild</code>. Note, however, that while some
        implementations may instantiate different types of
        <code>Document</code> objects supporting additional features than the
        "Core", such as "HTML" <bibref role="informative" ref="DOM2HTML"/>,
        based on the <code>DocumentType</code> specified at creation time,
        changing it afterwards is very unlikely to result in a change of the
        features supported.</p>
    </descr> 
  </attribute>

  <attribute readonly="yes" name="implementation" type="DOMImplementation" id="ID-1B793EBA">
    <descr>
      <p>The <code>DOMImplementation</code> object that handles this
        document. A DOM application may use objects from multiple
        implementations.</p>
    </descr> 
  </attribute>
  
  <attribute readonly="yes" name="documentElement" type="Element" id="ID-87CD092">
    <descr>

      <p>This is a <termref def="dt-convenience">convenience</termref>
	attribute that allows direct access to the child node that is the
	<termref def="dt-document-element">document element</termref> of the
	document.</p>
    </descr>
  </attribute>

  <!-- ********** -->
  <method name="createElement" id="ID-2141741547">
    <descr>
      <p>Creates an element of the type specified. Note that the instance
        returned implements the <code>Element</code> interface, so attributes
        can be specified directly  on the returned object.</p>
      <p>In addition, if there are known attributes with default values,
	<code>Attr</code> nodes representing them are automatically created and
	attached to the element.</p>
      <p>To create an element with a <termref def="dt-qualifiedname">qualified name</termref> and <termref def="dt-namespaceURI">namespace URI</termref>, use the
	<code>createElementNS</code> method.</p>
    </descr>
    <parameters>
      <param name="tagName" type="DOMString" attr="in">
	<descr>
          <p>The name of the element type to instantiate. For XML, this is
            case-sensitive, otherwise it depends on the case-sensitivity of the
            markup language in use. In that case, the name is mapped to the
            canonical form of that markup by the DOM implementation.</p>
        </descr>
      </param>
    </parameters>
    <returns type="Element">
      <descr><p>A new <code>Element</code> object with the
          <code>nodeName</code> attribute set to <code>tagName</code>, and
          <code>localName</code>, <code>prefix</code>, and
          <code>namespaceURI</code> set to <code>null</code>.</p>
      </descr>
    </returns>
    <raises>
      <exception name="DOMException">
        <descr>
          <p>INVALID_CHARACTER_ERR: Raised if the specified name contains an
            illegal character according to the XML version in use
	    specified in the <code>Document.xmlVersion</code> attribute.</p>
        </descr>
      </exception>
    </raises>
  </method>
  
  <!-- ********** -->
  <method name="createDocumentFragment" id="ID-35CB04B5">
    <descr>
      <p>Creates an empty <code>DocumentFragment</code> object.</p>
    </descr>
    <parameters>
      <!-- No parameters -->
    </parameters>
    <returns type="DocumentFragment">
      <descr>
        <p>A new <code>DocumentFragment</code>.</p>
      </descr>
    </returns>
    <raises>
      <!-- Throws no exceptions -->
    </raises>
  </method>

  <!-- ********** -->
  <method name="createTextNode" id="ID-1975348127">
    <descr>
      <p>Creates a <code>Text</code> node given the specified string.</p>
    </descr> 
    <parameters>
      <param name="data" type="DOMString" attr="in">
	<descr>
          <p>The data for the node.</p>
        </descr>
      </param>
    </parameters>
    <returns type="Text">
      <descr>
        <p>The new <code>Text</code> object.</p>
      </descr>
    </returns>
    <raises>
      <!-- Throws no exceptions -->
    </raises>
  </method>

  <!-- ********** -->
  <method name="createComment" id="ID-1334481328">
    <descr>
      <p>Creates a <code>Comment</code> node given the specified string.</p>
    </descr> 
    <parameters>
      <param name="data" type="DOMString" attr="in">
	<descr>
          <p>The data for the node.</p>
        </descr>
      </param>
    </parameters>
    <returns type="Comment">
      <descr>
        <p>The new <code>Comment</code> object.</p>
      </descr>
    </returns>
    <raises>
      <!-- Throws no exceptions -->
    </raises>
  </method>

  <!-- ********** -->
  <method name="createCDATASection" id="ID-D26C0AF8">
    <descr>
      <p>Creates a <code>CDATASection</code> node whose value is the specified
        string.</p>
    </descr> 
    <parameters>
      <param name="data" type="DOMString" attr="in">
	<descr>
          <p>The data for the <code>CDATASection</code> contents.</p>
	</descr>
      </param>
    </parameters>
    <returns type="CDATASection">
      <descr>
        <p>The new <code>CDATASection</code> object.</p>
      </descr>
    </returns>
    <raises>
      <exception name="DOMException">
        <descr>
          <p>NOT_SUPPORTED_ERR: Raised if this document is an HTML
            document.</p>
        </descr>
      </exception>
    </raises>
  </method>

  <!-- ********** -->
  <method name="createProcessingInstruction" id="ID-135944439">
    <descr>
      <p>Creates a <code>ProcessingInstruction</code> node given the specified
        name and data strings.</p>
    </descr> 
    <parameters>
      <param name="target" type="DOMString" attr="in">
	<descr>
          <p>The target part of the processing instruction.</p>
          <p>Unlike <code>Document.createElementNS</code> or
          <code>Document.createAttributeNS</code>, no namespace
          well-formed checking is done on the target name. Applications
          should invoke <code>Document.normalizeDocument()</code> with
          the parameter "<termref def="parameter-namespaces">namespaces</termref>" set to
          <code>true</code> in order to ensure that the target name is
          namespace well-formed.
	  </p>
        </descr>
      </param>
      <param name="data" type="DOMString" attr="in">
	<descr>
          <p>The data for the node.</p>
        </descr>
      </param>
    </parameters>
    <returns type="ProcessingInstruction">
      <descr>
        <p>The new <code>ProcessingInstruction</code> object.</p>
      </descr>
    </returns>
    <raises>
      <exception name="DOMException">
        <descr>
          <p>INVALID_CHARACTER_ERR: Raised if the specified target contains an
            illegal character according to the XML version in use
	    specified in the <code>Document.xmlVersion</code> attribute.</p>
          <p>NOT_SUPPORTED_ERR: Raised if this document is an HTML
            document.</p>
	</descr>
      </exception>
    </raises>
  </method>

  <!-- ********** -->
  <method name="createAttribute" id="ID-1084891198">
    <descr>
      <p>Creates an <code>Attr</code> of the given name. Note that the
        <code>Attr</code> instance can then be set on an <code>Element</code>
        using the <code>setAttributeNode</code> method. </p>
      <p>To create an attribute with a <termref def="dt-qualifiedname">qualified name</termref> and <termref def="dt-namespaceURI">namespace URI</termref>, use
	the <code>createAttributeNS</code> method.</p>
    </descr>
    <parameters>
      <param name="name" type="DOMString" attr="in">
	<descr>
          <p>The name of the attribute.</p>
        </descr>
      </param>
    </parameters>
    <returns type="Attr">
      <descr>
        <p>A new <code>Attr</code> object with the <code>nodeName</code>
          attribute set to <code>name</code>, and <code>localName</code>,
          <code>prefix</code>, and <code>namespaceURI</code> set to
          <code>null</code>. The value of the attribute is the empty
          string.</p>
      </descr>
    </returns>
    <raises>
      <exception name="DOMException">
        <descr>
          <p>INVALID_CHARACTER_ERR: Raised if the specified name contains an
            illegal character according to the XML version in use
	    specified in the <code>Document.xmlVersion</code> attribute.</p>
        </descr>
      </exception>
    </raises>
  </method>

  <me