You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
599 lines
20 KiB
599 lines
20 KiB
/* |
|
* 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; |
|
|
|
/** |
|
* <p> |
|
* <code>Node</code> defines the polymorphic behavior for all XML nodes in a |
|
* dom4j tree. |
|
* </p> |
|
* |
|
* <p> |
|
* 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. |
|
* </p> |
|
* |
|
* <p> |
|
* A node may optionally support the parent relationship and may be read only. |
|
* </p> |
|
* |
|
* @author <a href="mailto:jstrachan@apache.org">James Strachan </a> |
|
* @version $Revision$ |
|
* |
|
* @see #supportsParent |
|
* @see #isReadOnly |
|
*/ |
|
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; |
|
|
|
/** |
|
* <p> |
|
* <code>supportsParent</code> returns true if this node supports the |
|
* parent relationship. |
|
* </p> |
|
* |
|
* <p> |
|
* 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. |
|
* </p> |
|
* |
|
* @return true if this node supports the parent relationship or false it is |
|
* not supported |
|
*/ |
|
boolean supportsParent(); |
|
|
|
/** |
|
* <p> |
|
* <code>getParent</code> returns the parent <code>Element</code> if |
|
* this node supports the parent relationship or null if it is the root |
|
* element or does not support the parent relationship. |
|
* </p> |
|
* |
|
* <p> |
|
* This method is an optional feature and may not be supported for all |
|
* <code>Node</code> implementations. |
|
* </p> |
|
* |
|
* @return the parent of this node or null if it is the root of the tree or |
|
* the parent relationship is not supported. |
|
*/ |
|
Element getParent(); |
|
|
|
/** |
|
* <p> |
|
* <code>setParent</code> sets the parent relationship of this node if the |
|
* parent relationship is supported or does nothing if the parent |
|
* relationship is not supported. |
|
* </p> |
|
* |
|
* <p> |
|
* This method should only be called from inside an <code>Element</code> |
|
* implementation method and is not intended for general use. |
|
* </p> |
|
* |
|
* @param parent |
|
* is the new parent of this node. |
|
*/ |
|
void setParent(Element parent); |
|
|
|
/** |
|
* <p> |
|
* <code>getDocument</code> returns the <code>Document</code> that this |
|
* <code>Node</code> is part of if this node supports the parent |
|
* relationship. |
|
* </p> |
|
* |
|
* <p> |
|
* This method is an optional feature and may not be supported for all |
|
* <code>Node</code> implementations. |
|
* </p> |
|
* |
|
* @return the document of this node or null if this feature is not |
|
* supported or the node is not associated with a |
|
* <code>Document</code> |
|
*/ |
|
Document getDocument(); |
|
|
|
/** |
|
* <p> |
|
* <code>setDocument</code> sets the document of this node if the parent |
|
* relationship is supported or does nothing if the parent relationship is |
|
* not supported. |
|
* </p> |
|
* |
|
* <p> |
|
* This method should only be called from inside a <code>Document</code> |
|
* implementation method and is not intended for general use. |
|
* </p> |
|
* |
|
* @param document |
|
* is the new document of this node. |
|
*/ |
|
void setDocument(Document document); |
|
|
|
/** |
|
* <p> |
|
* <code>isReadOnly</code> returns true if this node is read only and |
|
* cannot be modified. Any attempt to modify a read-only <code>Node</code> |
|
* will result in an <code>UnsupportedOperationException</code> being |
|
* thrown. |
|
* </p> |
|
* |
|
* @return true if this <code>Node</code> is read only and cannot be |
|
* modified otherwise false. |
|
*/ |
|
boolean isReadOnly(); |
|
|
|
/** |
|
* <p> |
|
* <code>hasContent</code> 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. |
|
* </p> |
|
* |
|
* @return true if this <code>Node</code> is a Branch with a nodeCount() |
|
* of one or more. |
|
*/ |
|
boolean hasContent(); |
|
|
|
/** |
|
* <p> |
|
* <code>getName</code> 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. |
|
* </p> |
|
* |
|
* @return the XML name of this node |
|
*/ |
|
String getName(); |
|
|
|
/** |
|
* <p> |
|
* Sets the text data of this node or this method will throw an |
|
* <code>UnsupportedOperationException</code> if it is read-only. |
|
* </p> |
|
* |
|
* @param name |
|
* is the new name of this node |
|
*/ |
|
void setName(String name); |
|
|
|
/** |
|
* <p> |
|
* Returns the text of this node. |
|
* </p> |
|
* |
|
* @return the text for this node. |
|
*/ |
|
String getText(); |
|
|
|
/** |
|
* <p> |
|
* Sets the text data of this node or this method will throw an |
|
* <code>UnsupportedOperationException</code> if it is read-only. |
|
* </p> |
|
* |
|
* @param text |
|
* is the new textual value of this node |
|
*/ |
|
void setText(String text); |
|
|
|
/** |
|
* Returns the XPath string-value of this node. The behaviour of this method |
|
* is defined in the <a href="http://www.w3.org/TR/xpath">XPath |
|
* specification </a>. |
|
* |
|
* @return the text from all the child Text and Element nodes appended |
|
* together. |
|
*/ |
|
String getStringValue(); |
|
|
|
/** |
|
* <p> |
|
* 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. |
|
* </p> |
|
* |
|
* @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); |
|
|
|
/** |
|
* <p> |
|
* 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. |
|
* </p> |
|
* |
|
* @return the XPath expression which will return a nodeset containing just |
|
* this node. |
|
*/ |
|
String getUniquePath(); |
|
|
|
/** |
|
* <p> |
|
* 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. |
|
* </p> |
|
* |
|
* @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); |
|
|
|
/** |
|
* <p> |
|
* <code>asXML</code> returns the textual XML representation of this node. |
|
* </p> |
|
* |
|
* @return the XML representation of this node |
|
*/ |
|
String asXML(); |
|
|
|
/** |
|
* <p> |
|
* <code>write</code> 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. |
|
* </p> |
|
* |
|
* @param writer |
|
* is the <code>Writer</code> 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(); |
|
|
|
/** |
|
* <p> |
|
* 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. |
|
* </p> |
|
* |
|
* <p> |
|
* This method is useful if you want to remove a node from its source |
|
* document and add it to another document. For example |
|
* </p> |
|
* <code> Node node = ...; Element someOtherElement = ...; |
|
* someOtherElement.add( node.detach() ); </code> |
|
* |
|
* @return the node that has been removed from its parent node if any and |
|
* its document if any. |
|
*/ |
|
Node detach(); |
|
|
|
/** |
|
* <p> |
|
* <code>selectNodes</code> evaluates an XPath expression and returns the |
|
* result as a <code>List</code> of <code>Node</code> instances or |
|
* <code>String</code> instances depending on the XPath expression. |
|
* </p> |
|
* |
|
* @param xpathExpression |
|
* is the XPath expression to be evaluated |
|
* |
|
* @return the list of <code>Node</code> or <code>String</code> |
|
* instances depending on the XPath expression |
|
*/ |
|
List selectNodes(String xpathExpression); |
|
|
|
/** |
|
* <p> |
|
* <code>selectObject</code> 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. |
|
* </p> |
|
* |
|
* @param xpathExpression |
|
* is the XPath expression to be evaluated |
|
* |
|
* @return the value of the XPath expression as a {@link List}of {@link |
|
* Node} instances, a {@link String}or a {@link Number}instance |
|
* depending on the XPath expression. |
|
*/ |
|
Object selectObject(String xpathExpression); |
|
|
|
/** |
|
* <p> |
|
* <code>selectNodes</code> evaluates an XPath expression then sorts the |
|
* results using a secondary XPath expression Returns a sorted |
|
* <code>List</code> of <code>Node</code> instances. |
|
* </p> |
|
* |
|
* @param xpathExpression |
|
* is the XPath expression to be evaluated |
|
* @param comparisonXPathExpression |
|
* is the XPath expression used to compare the results by for |
|
* sorting |
|
* |
|
* @return the list of <code>Node</code> instances sorted by the |
|
* comparisonXPathExpression |
|
*/ |
|
List selectNodes(String xpathExpression, String comparisonXPathExpression); |
|
|
|
/** |
|
* <p> |
|
* <code>selectNodes</code> evaluates an XPath expression then sorts the |
|
* results using a secondary XPath expression Returns a sorted |
|
* <code>List</code> of <code>Node</code> instances. |
|
* </p> |
|
* |
|
* @param xpathExpression |
|
* is the XPath expression to be evaluated |
|
* @param comparisonXPathExpression |
|
* is the XPath expression used to compare the results by for |
|
* sorting |
|
* @param removeDuplicates |
|
* if this parameter is true then duplicate values (using the |
|
* comparisonXPathExpression) are removed from the result List. |
|
* |
|
* @return the list of <code>Node</code> instances sorted by the |
|
* comparisonXPathExpression |
|
*/ |
|
List selectNodes(String xpathExpression, String comparisonXPathExpression, |
|
boolean removeDuplicates); |
|
|
|
/** |
|
* <p> |
|
* <code>selectSingleNode</code> evaluates an XPath expression and returns |
|
* the result as a single <code>Node</code> instance. |
|
* </p> |
|
* |
|
* @param xpathExpression |
|
* is the XPath expression to be evaluated |
|
* |
|
* @return the <code>Node</code> matching the XPath expression |
|
*/ |
|
Node selectSingleNode(String xpathExpression); |
|
|
|
/** |
|
* <p> |
|
* <code>valueOf</code> 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 <a |
|
* href="http://www.w3.org/TR/xpath">XPath specification </a>. |
|
* </p> |
|
* |
|
* @param xpathExpression |
|
* is the XPath expression to be evaluated |
|
* |
|
* @return the string-value representation of the results of the XPath |
|
* expression |
|
*/ |
|
String valueOf(String xpathExpression); |
|
|
|
/** |
|
* <p> |
|
* <code>numberValueOf</code> 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. |
|
* </p> |
|
* |
|
* @param xpathExpression |
|
* is the XPath expression to be evaluated |
|
* |
|
* @return the numeric result of the XPath expression or null if the result |
|
* is not a number. |
|
*/ |
|
Number numberValueOf(String xpathExpression); |
|
|
|
/** |
|
* <p> |
|
* <code>matches</code> returns true if evaluating the given XPath |
|
* expression on this node returns a non-empty node set containing this |
|
* node. |
|
* </p> |
|
* |
|
* <p> |
|
* 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... |
|
* </p> |
|
* <code>if ( node.selectSingleNode( "/some/path" ) != nulll )</code> |
|
* |
|
* @param xpathExpression |
|
* is an XPath expression |
|
* |
|
* @return true if this node is returned by the given XPath expression |
|
*/ |
|
boolean matches(String xpathExpression); |
|
|
|
/** |
|
* <p> |
|
* <code>createXPath</code> creates an XPath object for the given |
|
* xpathExpression. The XPath object allows the variable context to be |
|
* specified. |
|
* </p> |
|
* |
|
* @param xpathExpression |
|
* is the XPath expression to be evaluated |
|
* |
|
* @return an XPath object represeting the given expression |
|
* |
|
* @throws InvalidXPathException |
|
* if the XPath expression is invalid |
|
*/ |
|
XPath createXPath(String xpathExpression) throws InvalidXPathException; |
|
|
|
/** |
|
* <p> |
|
* <code>asXPathResult</code> 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. |
|
* </p> |
|
* |
|
* @param parent |
|
* DOCUMENT ME! |
|
* |
|
* @return a <code>Node</code> which supports the parent relationship |
|
*/ |
|
Node asXPathResult(Element parent); |
|
|
|
/** |
|
* <p> |
|
* <code>accept</code> is the method used in the Visitor Pattern. |
|
* </p> |
|
* |
|
* @param visitor |
|
* is the visitor in the Visitor Pattern |
|
*/ |
|
void accept(Visitor visitor); |
|
|
|
/** |
|
* <p> |
|
* <code>clone</code> will return a deep clone or if this node is |
|
* read-only then clone will return the same instance. |
|
* </p> |
|
* |
|
* @return a deep clone of myself or myself if I am read only. |
|
*/ |
|
Object clone(); |
|
} |
|
|
|
/* |
|
* Redistribution and use of this software and associated documentation |
|
* ("Software"), with or without modification, are permitted provided that the |
|
* following conditions are met: |
|
* |
|
* 1. Redistributions of source code must retain copyright statements and |
|
* notices. Redistributions must also contain a copy of this document. |
|
* |
|
* 2. Redistributions in binary form must reproduce the above copyright notice, |
|
* this list of conditions and the following disclaimer in the documentation |
|
* and/or other materials provided with the distribution. |
|
* |
|
* 3. The name "DOM4J" must not be used to endorse or promote products derived |
|
* from this Software without prior written permission of MetaStuff, Ltd. For |
|
* written permission, please contact dom4j-info@metastuff.com. |
|
* |
|
* 4. Products derived from this Software may not be called "DOM4J" nor may |
|
* "DOM4J" appear in their names without prior written permission of MetaStuff, |
|
* Ltd. DOM4J is a registered trademark of MetaStuff, Ltd. |
|
* |
|
* 5. Due credit should be given to the DOM4J Project - http://www.dom4j.org |
|
* |
|
* THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS ``AS IS'' AND |
|
* ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
|
* ARE DISCLAIMED. IN NO EVENT SHALL METASTUFF, LTD. OR ITS CONTRIBUTORS BE |
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
|
* POSSIBILITY OF SUCH DAMAGE. |
|
* |
|
* Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved. |
|
*/
|
|
|