/*
* Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved.
*
* This software is open source.
* See the bottom of this file for the licence.
*/
package org.dom4j;
import java.io.IOException;
import java.io.Writer;
import java.util.List;
/**
* Node
defines the polymorphic behavior for all XML nodes in a
* dom4j tree.
*
* A node can be output as its XML format, can be detached from its position in
* a document and can have XPath expressions evaluated on itself.
*
* A node may optionally support the parent relationship and may be read only.
*
* @author James Strachan
* @version $Revision: 1.31 $
*
* @see #supportsParent
* @see #isReadOnly
*/
@SuppressWarnings("unused")
public interface Node extends Cloneable {
// W3C DOM complient node type codes
/** Matches Element nodes */
short ANY_NODE = 0;
/** Matches Element nodes */
short ELEMENT_NODE = 1;
/** Matches elements nodes */
short ATTRIBUTE_NODE = 2;
/** Matches elements nodes */
short TEXT_NODE = 3;
/** Matches elements nodes */
short CDATA_SECTION_NODE = 4;
/** Matches elements nodes */
short ENTITY_REFERENCE_NODE = 5;
/** Matches elements nodes */
// public static final short ENTITY_NODE = 6;
/** Matches ProcessingInstruction */
short PROCESSING_INSTRUCTION_NODE = 7;
/** Matches Comments nodes */
short COMMENT_NODE = 8;
/** Matches Document nodes */
short DOCUMENT_NODE = 9;
/** Matches DocumentType nodes */
short DOCUMENT_TYPE_NODE = 10;
// public static final short DOCUMENT_FRAGMENT_NODE = 11;
// public static final short NOTATION_NODE = 12;
/** Matchs a Namespace Node - NOTE this differs from DOM */
// XXXX: ????
short NAMESPACE_NODE = 13;
/** Does not match any valid node */
short UNKNOWN_NODE = 14;
/** The maximum number of node types for sizing purposes */
short MAX_NODE_TYPE = 14;
/**
*
* supportsParent
returns true if this node supports the
* parent relationship.
*
* Some XML tree implementations are singly linked and only support downward * navigation through children relationships. The default case is that both * parent and children relationships are supported though for memory and * performance reasons the parent relationship may not be supported. *
* * @return true if this node supports the parent relationship or false it is * not supported */ boolean supportsParent(); /** *
* getParent
returns the parent Element
if
* this node supports the parent relationship or null if it is the root
* element or does not support the parent relationship.
*
* This method is an optional feature and may not be supported for all
* Node
implementations.
*
* setParent
sets the parent relationship of this node if the
* parent relationship is supported or does nothing if the parent
* relationship is not supported.
*
* This method should only be called from inside an Element
* implementation method and is not intended for general use.
*
* getDocument
returns the Document
that this
* Node
is part of if this node supports the parent
* relationship.
*
* This method is an optional feature and may not be supported for all
* Node
implementations.
*
Document
*/
Document getDocument();
/**
*
* setDocument
sets the document of this node if the parent
* relationship is supported or does nothing if the parent relationship is
* not supported.
*
* This method should only be called from inside a Document
* implementation method and is not intended for general use.
*
* isReadOnly
returns true if this node is read only and
* cannot be modified. Any attempt to modify a read-only Node
* will result in an UnsupportedOperationException
being
* thrown.
*
Node
is read only and cannot be
* modified otherwise false.
*/
boolean isReadOnly();
/**
*
* hasContent
returns true if this node is a Branch (either
* an Element or a Document) and it contains at least one content node such
* as a child Element or Text node.
*
Node
is a Branch with a nodeCount()
* of one or more.
*/
boolean hasContent();
/**
*
* getName
returns the name of this node. This is the XML
* local name of the element, attribute, entity or processing instruction.
* For CDATA and Text nodes this method will return null.
*
* Sets the text data of this node or this method will throw an
* UnsupportedOperationException
if it is read-only.
*
* Returns the text of this node. *
* * @return the text for this node. */ String getText(); /** *
* Sets the text data of this node or this method will throw an
* UnsupportedOperationException
if it is read-only.
*
* Returns the XPath expression which will return a node set containing the * given node such as /a/b/@c. No indexing will be used to restrict the * path if multiple elements with the same name occur on the path. *
* * @return the XPath expression which will return a nodeset containing at * least this node. */ String getPath(); /** * Returns the relative XPath expression which will return a node set * containing the given node such as a/b/@c. No indexing will be used to * restrict the path if multiple elements with the same name occur on the * path. * * @param context * is the parent context from which the relative path should * start. If the context is null or the context is not an * ancestor of this node then the path will be absolute and start * from the document and so begin with the '/' character. * * @return the XPath expression relative to the given context which will * return a nodeset containing at least this node. */ String getPath(Element context); /** ** Returns the XPath expression which will return a nodeset of one node * which is the current node. This method will use the XPath index operator * to restrict the path if multiple elements with the same name occur on the * path. *
* * @return the XPath expression which will return a nodeset containing just * this node. */ String getUniquePath(); /** ** Returns the relative unique XPath expression from the given context which * will return a nodeset of one node which is the current node. This method * will use the XPath index operator to restrict the path if multiple * elements with the same name occur on the path. *
* * @param context * is the parent context from which the path should start. If the * context is null or the context is not an ancestor of this node * then the path will start from the document and so begin with * the '/' character. * * @return the XPath expression relative to the given context which will * return a nodeset containing just this node. */ String getUniquePath(Element context); /** *
* asXML
returns the textual XML representation of this node.
*
* write
writes this node as the default XML notation for
* this node. If you wish to control the XML output (such as for pretty
* printing, changing the indentation policy etc.) then please use {@link
* org.dom4j.io.XMLWriter} or its derivations.
*
Writer
to output the XML to
*
* @throws IOException
* DOCUMENT ME!
*/
void write(Writer writer) throws IOException;
/**
* Returns the code according to the type of node. This makes processing
* nodes polymorphically much easier as the switch statement can be used
* instead of multiple if (instanceof) statements.
*
* @return a W3C DOM complient code for the node type such as ELEMENT_NODE
* or ATTRIBUTE_NODE
*/
short getNodeType();
/**
* DOCUMENT ME!
*
* @return the name of the type of node such as "Document", "Element",
* "Attribute" or "Text"
*/
String getNodeTypeName();
/**
* * Removes this node from its parent if there is one. If this node is the * root element of a document then it is removed from the document as well. *
* ** This method is useful if you want to remove a node from its source * document and add it to another document. For example *
* Node node = ...; Element someOtherElement = ...;
* someOtherElement.add( node.detach() );
*
* @return the node that has been removed from its parent node if any and
* its document if any.
*/
Node detach();
/**
*
* selectNodes
evaluates an XPath expression and returns the
* result as a List
of Node
instances or
* String
instances depending on the XPath expression.
*
Node
or String
* instances depending on the XPath expression
*/
List
* selectObject
evaluates an XPath expression and returns the
* result as an {@link Object}. The object returned can either be a {@link
* List} of one or more {@link Node}instances or a scalar object like a
* {@link String}or a {@link Number}instance depending on the XPath
* expression.
*
* selectNodes
evaluates an XPath expression then sorts the
* results using a secondary XPath expression Returns a sorted
* List
of Node
instances.
*
Node
instances sorted by the
* comparisonXPathExpression
*/
List
* selectNodes
evaluates an XPath expression then sorts the
* results using a secondary XPath expression Returns a sorted
* List
of Node
instances.
*
Node
instances sorted by the
* comparisonXPathExpression
*/
List
* selectSingleNode
evaluates an XPath expression and returns
* the result as a single Node
instance.
*
Node
matching the XPath expression
*/
Node selectSingleNode(String xpathExpression);
/**
*
* valueOf
evaluates an XPath expression and returns the
* textual representation of the results the XPath string-value of this
* node. The string-value for a given node type is defined in the XPath specification .
*
* numberValueOf
evaluates an XPath expression and returns
* the numeric value of the XPath expression if the XPath expression results
* in a number, or null if the result is not a number.
*
* matches
returns true if evaluating the given XPath
* expression on this node returns a non-empty node set containing this
* node.
*
* This method does not behave like the <xsl:if> element - if you want * that behaviour, to evaluate if an XPath expression matches something, * then you can use the following code to be equivalent... *
*if ( node.selectSingleNode( "/some/path" ) != nulll )
*
* @param xpathExpression
* is an XPath expression
*
* @return true if this node is returned by the given XPath expression
*/
boolean matches(String xpathExpression);
/**
*
* createXPath
creates an XPath object for the given
* xpathExpression. The XPath object allows the variable context to be
* specified.
*
* asXPathResult
returns a version of this node which is
* capable of being an XPath result. The result of an XPath expression
* should always support the parent relationship, whether the original XML
* tree was singly or doubly linked. If the node does not support the parent
* relationship then a new node will be created which is linked to its
* parent and returned.
*
Node
which supports the parent relationship
*/
Node asXPathResult(Element parent);
/**
*
* accept
is the method used in the Visitor Pattern.
*
* clone
will return a deep clone or if this node is
* read-only then clone will return the same instance.
*