- Simple API For XML Version 2 (SAX2)
- Auxiliary SAX Interfaces
- SAX and I/O
- SAX Error Handling
- The Glue of SAX: XMLReader
- The Document Object Model
- The Object Model
- The DOM and Factories
- The Node Interface
- Parents and Children
- Nonhierarchical Nodes
- Text Nodes
- Element and Attribute Nodes
- Document, Document Type, and Entity Nodes
- Bulk Insertion Using Document Fragment
- DOM Error Handling
- Implementation vs Interface
- DOM Traversal
- Where Are We?
Nonhierarchical Nodes
There are a few structural Infoset properties that do not fit into the [parent]/[children] relationships of the Infoset. These include the [attributes] property of an element information item as well as the [notations] and [entities] properties of a document information item. Each of these properties exposes a collection of information items as an unordered collection that is accessed by name. To model this sort of collection, the DOM defines the NamedNodeMap interface.
interface NamedNodeMap { Node item(in unsigned long index); readonly attribute unsigned long length; Node getNamedItemNS(in DOMString namespaceURI, in DOMString localName); Node getNamedItem(in DOMString name); Node setNamedItemNS(in Node arg) raises(DOMException); Node setNamedItem(in Node arg) raises(DOMException); Node removeNamedItemNS(in DOMString namespaceURI, in DOMString localName) raises(DOMException); Node removeNamedItem(in DOMString name) raises(DOMException); };
Note that this interface provides both positional and named access via its item and getNamedItem methods, respectively. The NamedNodeMap interface is used to access attribute, entity, and notation information items. Since attribute information items use namespaces, but entity and notation information items do not, the three "NamedItem" methods come in two forms—one that works in terms of namespace URI + local name and one that works in terms of just name. The former style is for attributes, and the latter form is for entities and notations.
The [attributes] Infoset property is exposed via the attributes attribute on the Node interface.
interface Node { readonly attribute NamedNodeMap attributes; : : : : };
The following code adds an attribute to the provided element:
import org.w3c.dom.*; void annotate(Node elem) { Document document = elem.getOwnerDocument(); Node attr = document.createAttributeNS( "http://foo.com/names", "note"); attr.setNodeValue("Hello, world"); NamedNodeMap attrs = elem.getAttributes(); attrs.setNamedItemNS(attr); }
Because the attributes attribute is only valid for Element nodes, this code will fail miserably for non-Element nodes.
The [notations] and [entities] Infoset properties are exposed via the notations and entities attributes of the DocumentType interface.
interface DocumentType : Node { readonly attribute NamedNodeMap entities; readonly attribute NamedNodeMap notations; };
The DocumentType node is available as an attribute of the Document interface.
interface Document : Node { readonly attribute DocumentType doctype; : : : : };
Given these interface definitions, the following Java code returns the entity named bob that is related to a node's document:
import org.w3c.dom.*; Node getBob(Node someNode) { Document document = someNode.getOwnerDocument(); DocumentType doctype = document.getDoctype(); if (doctype == null) return null; NamedNodeMap entities = doctype.getEntities(); return entities.getNamedItem("bob"); }
Note that the node returned by this function also implements the Entity interface to provide access to the [system identifier], [public identifier], and [notation] Infoset properties.